我已经阅读了很多关于将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()函数,但我找不到一个有用的代码。
答案 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上完成了这项工作。