2011-07-01 10 views
1

私はC#とEFにはかなり新しく、次の質問に対する回答を見つけることができませんでした。Linq linq-to-entitiesは、条件が満たされた場合に結合を追加します。

私は同じモデルの異なるテーブルに行くいくつかの "オプションのクエリ"と "メインクエリ" query1に参加したい、どのように達成するはずですか?

私が参加()メソッドを使用しようとすると、それは限り、私はこれを行うように動作します:

var query = query1.Join(query2 [...]); 

をしかし

query = query1; 

if (condition_is_met) 
{ 
    query = query.Join(query2 [...]); 
} 

ような何かをしようとしたとき、私はエラー

を受け取ります

'System.Linq.IQueryable<AnonymousType#1>'を暗黙的に 'System.Collections.Generic.IEnumerable<someentity>'に変換することはできません。明示的な変換が存在します(キャストがありませんか?)

このエラーを回避するにはどうすればよいですか?条件が満たされた場合に実際に結合を追加する方法はありますか?

ご質問ありがとうございました。申し訳ありません。

+0

投稿したコードはコンパイルされますが、 'Join()'は何もしません。あなたは 'query = query.Join(...)'を意味しましたか? – svick

+0

おっと、もちろん、ありがとう...私は少し疲れています;) – Seb

答えて

2

条件付きでクエリに追加することはできますが、クエリが入力されるとその型を別のものに変更することはできません。あなたの問題は、クエリの1つが匿名型に、もう1つがエンティティに型付けされ、矛盾していることです。動作例

、参照:

var query = context.Foos.AsQueryable(); 

if (DateTime.Now.Second % 2 == 0) 
{ 
    query = query.Join(context.Bars, f => f.BarId, b => b.Id, (f, b) => new { f, b }).Select(item => item.f); 
} 
else 
{ 
    query = query.OrderByDescending(f => f.Id); 
} 

この動作理由は、最初の宣言がIQueryable<Foo>であり、得られたクエリの各々は、(参加又は規則のバージョンのいずれか)ままであることですIQueryable<Foo>

クエリ結果を匿名型に投影する必要がある場合は、それを後の手順(作成されたクエリのクエリ)に保存することをお勧めします。すべての結合、フィルタリング、注文などを構築し、最後に匿名型を引き出します。他のロジックに関係なくタイプが同じであれば、単一のクエリを構築することができます。

しかし、ロジックが実際に取得するデータの形状に影響を与える場合は、それが運が悪いところです。別の方向に進む必要があります。

+1

+1:この優れた答えの背後に私の体重を投げる。 – StriplingWarrior

+0

この回答をありがとう、それは私にどのように動作するのsimesの光を終了! – Seb

0

これは、Join()の結果が元のクエリのタイプと異なるタイプであるためです。条件の後のコードはどのように変数を扱うべきですか? 2つの異なるタイプのうちの1つを含むことができます。だから、このようにするのは簡単ではありません。

関連する問題