Isa*_*ger 5 c# linq predicatebuilder
我在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);
Run Code Online (Sandbox Code Playgroud)
我失败了.在Predicate中ORed一起使用的表达式基本上都是使用inputEnumerable中的相同t,当然我希望每个表达式ORed进入Predicate以使用与inputEnumerable不同的t.
我在循环之后查看调试器中的谓词,它看起来像IL.无论如何,那里的每个lambda看起来完全一样.
谁能告诉我这里可能做错了什么?
谢谢,
艾萨克
问题是闭包是如何工作的。您必须在本地复制 SomeOtherType t 实例,例如:
foreach (SomeOtherType t in inputEnumerable)
{
SomeOtherType localT = t;
Predicate = Predicate.Or( x => x.ListInSomeType.Contains(localT) )
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅:C# 循环中捕获的变量