[英]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.