我想结合一些Linq表达式,所以我从下面的文章中提供帮助:
http://www.c-sharpcorner.com/uploadfile/04fe4a/predicate-combinators-in-linq/ 和 http://thanhhh.blogspot.com/2011/10/linq-to-entities-predicatebuilder-and.html
我有一个像这样的通用列表:
ListlstPA = new List () { 2, 3 }; // the numbers can be added or removed
如果我在代码下使用合并我的linq表达式,我从db获得正确的结果(记录)(我使用Entity Framework 4.0):
var exp1 = Predicate.FalseExpression(); exp1 = exp1.Or(x => x.post_author == 2); exp1 = exp1.Or(x => x.post_author == 3);
但是当我在foreach循环中组合linq表达式时这样:
var exp1 = Predicate.FalseExpression(); foreach (long id in lstPA) { exp1 = exp1.Or(x => x.post_author == id); }
我无法从db获得正确的结果(记录).
什么是两个代码块之间的差异以及如何解决这个问题(我必须使用foreach循环)?
我相信你的问题与关闭有关.变量id分配给表达式,每次循环时它都会更新为更新的值.为了使用它,您需要创建一个单独范围的变量.
var exp1 = Predicate.FalseExpression<posts>(); foreach (long i in lstPA) { long id = i; exp1 = exp1.Or(x => x.post_author == id); }
但是,您可以在此实例中使用contains子句.
expr1 = x => lstPA.Contains(x.post_author);