我想结合一些Linq Expression,所以我可以从以下文章中获得帮助:
http://www.c-sharpcorner.com/uploadfile/04fe4a/predicate-combinators-in-linq/
和
http://thanhhh.blogspot.com/2011/10/linq-to-entities-predicatebuilder-and.html
我有一个像这样的通用列表:
List<long> lstPA = new List<long>() { 2, 3 }; // the numbers can be added or removed
如果我使用下面的代码来组合我的linq表达式,我将从db获得正确的结果(记录)(我使用Entity Framework 4.0):
var exp1 = Predicate.FalseExpression<posts>();
exp1 = exp1.Or(x => x.post_author == 2);
exp1 = exp1.Or(x => x.post_author == 3);
但是当我在一个foreach循环中组合linq表达式时,像这样:
var exp1 = Predicate.FalseExpression<posts>();
foreach (long id in lstPA)
{
exp1 = exp1.Or(x => x.post_author == id);
}
我无法从db获得正确的结果(记录)。
2个代码块之间的区别是什么?如何解决此问题(我必须使用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);
关于c# - C#如何在循环中组合一些Linq表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24954505/