5

我在 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);

让我失望了。Predicate 中的表达式 ORed 基本上都使用 inputEnumerable 中的相同 t,当然我希望每个表达式 ORed 到 Predicate 使用 inputEnumerable 中的不同 t。

我在循环之后查看了调试器中的谓词,它看起来像 IL。无论如何,那里的每个 lambda 看起来都完全相同。

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

谢谢,

艾萨克

4

2 回答 2

5

问题是闭包是如何工作的。您必须在本地复制 SomeOtherType t 实例,例如:

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

有关详细信息,请参阅:C# 循环中捕获的变量

于 2011-10-19T02:59:21.413 回答
1

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

foreach (SomeOtherType t in inputEnumerable)
{
    var someOtherType = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(someOtherType) )
}
于 2011-10-19T02:59:31.663 回答