C#如何在一个循环中组合一些Linq表达式

Meh*_*adi 1 c# linq loops linq-expressions combiners

我想结合一些Linq表达式,所以我从下面的文章中提供帮助:

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
Run Code Online (Sandbox Code Playgroud)

如果我在代码下使用合并我的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);
Run Code Online (Sandbox Code Playgroud)

但是当我在foreach循环中组合linq表达式时这样:

var exp1 = Predicate.FalseExpression<posts>();
foreach (long id in lstPA)
{
    exp1 = exp1.Or(x => x.post_author == id);
}
Run Code Online (Sandbox Code Playgroud)

我无法从db获得正确的结果(记录).

什么是两个代码块之间的差异以及如何解决这个问题(我必须使用foreach循环)?

Bob*_*ale 7

我相信你的问题与关闭有关.变量id分配给表达式,每次循环时它都会更新为更新的值.为了使用它,您需要创建一个单独范围的变量.

var exp1 = Predicate.FalseExpression<posts>();
foreach (long i in lstPA)
{
    long id = i;
    exp1 = exp1.Or(x => x.post_author == id);
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以在此实例中使用contains子句.

expr1 = x => lstPA.Contains(x.post_author);
Run Code Online (Sandbox Code Playgroud)