2012-04-13 16 views
5

私は、次の形式のエンティティクエリにLINQのを持っている:ネストされたクエリはサポートされていません。 Operation1 =「UnionAll」Operation2 =「MultiStreamNest」

var x = from a in SomeData 
    where ... some conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var y = from a in SomeData 
    where ... some other conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var results = x.Concat(y); 

(これは簡単な例である - 「」と「選択」の句は、より複雑です私は別のクエリ文を使用しています。単一の結合文を作成するには複雑すぎる、条件が多すぎる、コンパイルするまでに時間がかかる)

コンパイルは正常ですが、実行時に例外はありません:

"The nested query is not supported. Operation1='UnionAll' Operation2='MultiStreamNest' 

注:私はネストした型付けされた構造に投影しようとしています。私がConcat()の前にxとyの.ToList()を呼び出すとうまくいきます。さらにポイントとして、私のプロパティの1つは列挙型ですが、整数ラッパープロパティを使用して割り当てています。

すべてのデータをメモリに取り込むことなく、私がやりたいことができる方法はありますか?それともenumが失敗の原因ですか?

おかげで、

T

答えて

0

あなたは

var results = x.Union(y); 

と試みたことがありますか?

TIZ

または

var x = (from a in SomeData 
where ... some conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}).Concat(
from a in SomeData 
where ... some other conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}); 
+0

ちょうどこれらの2番目を試して、最初と全く同じように動作するようです、つまり、私が期待したように動作しません(@ Arionの投稿のコメントを参照してください)... –

+0

...今削除されました。とにかく、結果セットとして区別する必要がありますが、私は例外を取得 "Distinct操作は、指定された引数のコレクションResultTypeに適用することはできません"私は、Distinctはネストされたコレクション。 –

+0

空の場合どうしますか? – innovia

0

単一のIEnumerableにナビゲーションプロパティのマルチセットを連結または共用しようとすると、ここでのサンプルコードがある一方で、私は同様の問題があった:

var requiredDocuments =     
       (from x in db.RequestTypes where (some condition) select x.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       .Concat(
       (from c in db.Categories where (some condition) select c.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ) 
       .Concat(
       (from f in db.Fields where (some condition) select f.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ); 
+0

これは問題のあるコードですか? – Jerther

+0

これはConcatを実行する前にToListを呼び出すため、これはうまくいくはずです。 – Florian

0

あなたがしようとしていることを正しく理解していれば、私は同じ問題に何回も遭遇しました。要点は、ネストされた投影を持つ結合をサポートしていないことです。そうする必要がある場合は、最初にToListを使用して結果を具体化する必要があります。

関連する問題