2012-05-03 8 views
1

私はLINQ式を一緒に置くことについての記事を読んだことがありますが、それらはカバーしていると思われます。私は、このソリューションを実装している:LINQ式の作成

http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

は、どのように私はそれが動作するように、このコードを書くのですか?

Expression<Func<Crop, bool>> chooseOranges = crop => crop.IsOrange; 
Expression<Func<Farm, bool>> selectFarm = farm => farm.HasCows; 

selectFarm = selectFarm.And(farm => farm.Crops.Any(chooseOranges); 

コンパイルされますが、実行時に.NET 1025エラーがスローされます。 chooseOrangesをリテラルテキストに置き換えた場合、それはうまくいくが、chooseOrangesはビジネスロジックを使って1つずつ作成される。上にリンクしたコードは、さまざまなExpression.Foo()関数に依存しているようですが、助けになるものは見つかりませんでした。

答えて

2

使用LinqKitのネストされた式を評価し、書き出さ同じ表現をサポートする、プロバイダーによって使用可能な単一の式を返す能力:

Expression<Func<Crop, bool>> chooseOranges = crop => crop.IsOrange; 
Expression<Func<Farm, bool>> selectFarm = farm => farm.HasCows;  
Expression<Func<Farm, bool>> combined = (farm) => selectFarm.Invoke(farm) && farm.Crops.Any(inner => chooseOranges.Invoke(inner)); 
combined = combined.Expand(); 
+1

*明示的に書かれた同じ表現をサポートしている任意のプロバイダで使用できます。 – usr

+0

@usr確かに、そのステートメントをより強くするように更新 –

+0

最後の行は、実行しようとするとStackOverflowExceptionをスローします。それは私の終わりの問題ですか? – MrEff

1

が、私はこのようにそれを記述します。

Expression<Func<Crop, bool>> chooseOranges = crop => crop.IsOrange; 
Expression<Func<Farm, bool>> selectFarm = farm => farm.HasCows; 

IQueryable farmQuery = GetQuery(); 
farmQuery = farmQuery.Where(selectFarm); 
farmQuery = farmQuery.Where(farm => farm.Crops.Any(chooseOranges); 

各行は結果になるためには両方の条件を満たす必要があります。

または、私はthere以上でした。