编写LINQ表达式

时间:2012-05-03 21:13:03

标签: c# linq lambda

我已经阅读了很多关于将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是与业务逻辑一起构建的。看起来我上面链接的代码依赖于各种Expression.Foo()函数,但我找不到一个有用的代码。

2 个答案:

答案 0 :(得分: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 :(得分: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。

或者,我在there上完成了这项工作。