1

LINQ式の組み合わせに関する記事をたくさん読んだことがありますが、それらはand'sandor'sしかカバーしていないようです。私はこのソリューションを実装しています:

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

コンパイルしますが、実行時に.NET1025エラーをスローします。ChooseOrangesを文字通りのテキストに置き換えた場合は機能しますが、chooseOrangesはビジネスロジックを使用して1つずつ構築されます。上でリンクしたコードはさまざまなExpression.Foo()関数に依存しているようですが、役立つものが見つかりませんでした。

4

2 に答える 2

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();
于 2012-05-03T21:45:46.317 に答える
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); 

結果に含まれるには、各行が両方の基準を満たす必要があるため、それが And です。

または、私はあそこそれをしました。

于 2012-05-04T01:39:48.733 に答える