2012-05-13 18 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.で爆発するものです。

この悪いことをする方法はありますか?

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), 
         }; 

をそして、私の他のマップルックス:

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 

私はこのようなルックスを削減:

私はnew string[0]、代わりにEnumerable.Empty()のnew string[] { }、およびそれらの両方で失敗を試してみましたこのように:

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つのマップと働くので、犯人ではありません。

答えて

1

マップ機能でEnumerable.Empty<T>()の代わりにnullを使用する必要があります。あなたの関数を減らすには、あなたはnew string[0]Enumerable.Empty<string>()を交換し、この

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

その結果、「エラーCS0828:を匿名タイプのプロパティに割り当てることはできません。それが私の最初の試みだったことを忘れてしまった。 –

+0

'(IEnumerable )null'のようにnullをキャストするとどうなりますか? –

+0

それはキャストを取り除き、私は同じエラーを取得します。 –

0

のようにそれを行うことができます。

アヤンドによれば、消えるタイプの問題は修正されません。しかし、配列を使うように式を書き直すのはやりにくいはずです。

+0

私はそれを試みたと述べました。それがリストされた2番目のエラーメッセージです。 –

関連する問題