1

我已经阅读了一堆关于将 LINQ 表达式放在一起的文章,但它们似乎只涵盖了 and's 和 or'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);

它可以编译,但在运行时会引发 .NET 1025 错误。如果我将 chooseOranges 替换为文字文本,它会起作用,但 chooseOranges 是使用业务逻辑逐个构建的。我上面链接的代码似乎依赖于各种 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 回答