2012-05-13 24 views
0

長期和短期的它是我想該位添加到烏鴉多地圖查詢:RavenDB搞砸我的多地圖查詢。我究竟做錯了什麼?

this.AddMap<Ownership>(ownerships => from o in ownerships 
            select new 
            { 
             CardId = o.CardId, 
             Expansion = (string)null, 
             Owned = 1, 
             Rarity = (string)null, 
             Artist = Enumerable.Empty<string>(), 
             Colors = Enumerable.Empty<string>(), 
             ConvertedManaCost = Enumerable.Empty<decimal?>(), 
             Name = Enumerable.Empty<string>(), 
             Power = Enumerable.Empty<string>(), 
             Text = Enumerable.Empty<string>(), 
             Toughness = Enumerable.Empty<string>(), 
             Types = Enumerable.Empty<string>(), 
            }); 

和黑亮的轉換是表達這個(格式化的可讀性):

this.ForEntityNames.Add("Ownerships"); 
this.AddMapDefinition(docs => docs 
    .Where(__document => __document["@metadata"]["Raven-Entity-Name"] == "Ownerships") 
    .Select((Func<dynamic, dynamic>)(o => new 
    { 
     CardId = o.CardId, 
     Expansion = (System.String)null, 
     Owned = 1, 
     Rarity = (System.String)null, 
     Artist = Enumerable.Empty(), 
     Colors = Enumerable.Empty(), 
     ConvertedManaCost = Enumerable.Empty(), 
     Name = Enumerable.Empty(), 
     Power = Enumerable.Empty(), 
     Text = Enumerable.Empty(), 
     Toughness = Enumerable.Empty(), 
     Types = Enumerable.Empty(), 
     __document_id = o.__document_id 
    }))); 

由於顯而易見的原因,出現'System.Linq.Enumerable.Empty<TResult>()' cannot be inferred from the usage. Try specifying the type arguments explicitly.

有什麼辦法讓這個該死的東西工作?

我試過new string[0]new string[] { }代替Enumerable.Empty(),而這些都失敗:

System.InvalidOperationException: Could not understand query: 
-- line 2 col 219: invalid NewExpression 
-- line 2 col 259: Can't parse double .0.0 

    at Raven.Database.Linq.QueryParsingUtils.GetVariableDeclarationForLinqMethods(String query, Boolean requiresSelectNewAnonymousType) in c:\Builds\RavenDB-Stable\Raven.Database\Linq\QueryParsingUtils.cs:line 124 
    at Raven.Database.Linq.DynamicViewCompiler.TransformMapDefinitionFromLinqMethodSyntax(String query, String& entityName) in c:\Builds\RavenDB-Stable\Raven.Database\Linq\DynamicViewCompiler.cs:line 355 
    at Raven.Database.Linq.DynamicViewCompiler.HandleMapFunction(ConstructorDeclaration ctor, String map) in c:\Builds\RavenDB-Stable\Raven.Database\Linq\DynamicViewCompiler.cs:line 132 
    at Raven.Database.Linq.DynamicViewCompiler.TransformQueryToClass() in c:\Builds\RavenDB-Stable\Raven.Database\Linq\DynamicViewCompiler.cs:line 97 
    at Raven.Database.Linq.DynamicViewCompiler.GenerateInstance() in c:\Builds\RavenDB-Stable\Raven.Database\Linq\DynamicViewCompiler.cs:line 489 
    at Raven.Database.DocumentDatabase.PutIndex(String name, IndexDefinition definition) in c:\Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:line 724 
    at Raven.Database.Server.Responders.Index.Put(IHttpContext context, String index) in c:\Builds\RavenDB-Stable\Raven.Database\Server\Responders\Index.cs:line 71 
    at Raven.Database.Server.Responders.Index.Respond(IHttpContext context) in c:\Builds\RavenDB-Stable\Raven.Database\Server\Responders\Index.cs:line 48 
    at Raven.Database.Server.HttpServer.DispatchRequest(IHttpContext ctx) in c:\Builds\RavenDB-Stable\Raven.Database\Server\HttpServer.cs:line 548 
    at Raven.Database.Server.HttpServer.HandleActualRequest(IHttpContext ctx) in c:\Builds\RavenDB-Stable\Raven.Database\Server\HttpServer.cs:line 315 

我的降低看起來是這樣的:

this.Reduce = results => from r in results 
         group r by r.CardId into g 
         select new 
         { 
          CardId = g.Key, 
          Expansion = g.Select(r => r.Expansion).Where(v => v != null).FirstOrDefault(), 
          Owned = g.Sum(r => r.Owned), 
          Rarity = g.Select(r => r.Rarity).Where(v => v != null).FirstOrDefault(), 
          Artist = g.SelectMany(r => r.Artist), 
          Colors = g.SelectMany(r => r.Colors), 
          ConvertedManaCost = g.SelectMany(r => r.ConvertedManaCost), 
          Name = g.SelectMany(r => r.Name), 
          Power = g.SelectMany(r => r.Power), 
          Text = g.SelectMany(r => r.Text), 
          Toughness = g.SelectMany(r => r.Toughness), 
          Types = g.SelectMany(r => r.Types), 
         }; 

而我的其他地圖看上去像這樣:

this.AddMap<Card>(cards => from c in cards 
          select new 
          { 
           CardId = c.Id.ToString(), 
           Expansion = c.Expansion, 
           Owned = 0, 
           Rarity = c.Rarity, 
           Artist = c.NormalizedFaces.Select(f => f.Artist), 
           Colors = c.Colors, 
           ConvertedManaCost = c.NormalizedFaces.Select(f => f.ConvertedManaCost), 
           Name = c.NormalizedFaces.Select(f => f.Name), 
           Power = c.NormalizedFaces.Select(f => f.Power), 
           Text = 
            c.NormalizedFaces.Select(f => f.Name) 
            .Concat(c.NormalizedFaces.SelectMany(f => f.CardText)) 
            .Concat(c.NormalizedFaces.Select(f => f.Types)) 
            .Concat(c.NormalizedFaces.SelectMany(f => f.FlavorText)), 
           Toughness = c.NormalizedFaces.Select(f => f.Toughness), 
           Types = c.NormalizedFaces.Select(f => f.Types), 
          }); 

但是,我很確定那些不是罪魁禍首,因爲索引只與一個地圖一起工作並且減少。

回答

1

您只需在地圖功能中使用null而不是Enumerable.Empty<T>()。在您的降低功能,可以像下面這樣做

Artist = g.Select(r => r.Artist).Where(x => x != null).FirstOrDefault() 
+0

這會導致'錯誤CS0828:無法將分配給匿名類型屬性。我忘了提及那是我的第一次嘗試。 –

+0

當你像'(IEnumerable )null'那樣施放null時會發生什麼? –

+0

它需要鑄造出來,我得到同樣的錯誤。 –

0

更換Enumerable.Empty<string>()new string[0]

據Ayende介紹,類型消失的問題不會被修復。但重寫表達式來使用數組應該是關鍵。

+0

我提到我曾試過。這是列出的第二條錯誤消息。 –

相關問題