在foreach循环中使用predicatebuilder的问题

本文关键字:predicatebuilder 问题 foreach 循环 | 更新日期: 2023-09-27 18:11:43

我在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中组合在一起的表达式基本上都使用来自inputenenumerable的相同的t,当然,当我希望每个组合到Predicate中的表达式使用不同于inputenenumerable的t时。

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

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

谢谢,艾萨克

在foreach循环中使用predicatebuilder的问题

问题在于闭包是如何工作的。您必须在本地复制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) )
}
相关文章:
  • 没有找到相关文章