在 foreach 循环中使用 predicatebuilder 时出现问题

发布于 2024-12-10 19:26:50 字数 595 浏览 1 评论 0原文

我在 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 中进行 OR 运算的表达式基本上都使用来自 inputEnumerable 的相同 t,当然,我希望每个表达式进行 OR 运算到 Predicate 时使用来自 inputEnumerable 的不同 t。

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

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

谢谢,

艾萨克

I'm having trouble building predicates in a foreach loop. The variable that contains the value the enumerator is currently on is something I need to put in the predicate.

So,

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

is failing me. The expressions ORed together in Predicate basically all use the same t from inputEnumerable, when of course I want each expression ORed into Predicate to use a different t from inputEnumerable.

I looked at the predicate in the debugger after the loop and it is in what looks like IL. Anyways each lambda in there looks exactly the same.

Can anyone tell me what I might be doing wrong here?

Thanks,

Isaac

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

反话 2024-12-17 19:26:50

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

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

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

The problem is how closures work. You have to copy the SomeOtherType t instance in a local like:

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

For more information, please see: Captured variable in a loop in C#

且行且努力 2024-12-17 19:26:50

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

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

You're closing over the loop variable. Declare a local variable for your SomeOtherType and use that in your predicate.

foreach (SomeOtherType t in inputEnumerable)
{
    var someOtherType = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(someOtherType) )
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文