繁体   English   中英

在foreach循环中使用predicatebuilder遇到麻烦

[英]Trouble with using predicatebuilder in a foreach loop

我在foreach循环中无法构建谓词。 我需要在谓词中添加包含枚举器当前所在值的变量。

所以,

IQueryable query = getIQueryableSomehow();
Predicate = PredicateBuilder.False<SomeType>();
foreach (SomeOtherType t in inputEnumerable)
{
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(t) )
}
var results = query.Where(Predicate);

使我失望。 在谓词中ORed在一起的表达式基本上都使用inputEnumerable中的相同t,当然,当我希望将ORed into Predicate中的每个表达式使用与inputEnumerable不同的t时。

循环后,我在调试器中查看了谓词,它的外观类似于IL。 无论如何,那里的每个lambda看起来都完全一样。

谁能告诉我在这里我可能做错了什么?

谢谢,

以撒

问题是闭包如何工作。 您必须在本地类似环境中复制SomeOtherType t实例:

foreach (SomeOtherType t in inputEnumerable) 
{ 
    SomeOtherType localT = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(localT) ) 
}

有关更多信息,请参见: 在C#中的循环中捕获的变量

您正在关闭循环变量 SomeOtherType声明一个局部变量,并在谓词中使用它。

foreach (SomeOtherType t in inputEnumerable)
{
    var someOtherType = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(someOtherType) )
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM