首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ to SQL PredicateBuilder

LINQ to SQL PredicateBuilder
EN

Stack Overflow用户
提问于 2009-10-27 09:39:55
回答 2查看 1.9K关注 0票数 9

我正在使用这里看到的http://www.albahari.com/nutshell/predicatebuilder.aspx的PredicateBuilder,一切都很好,现在我可以生成动态LINQ to SQL表达式,但我不明白的是为什么我在这样的循环中:

代码语言:javascript
复制
var inner = PredicateBuilder.False<MyType>();
foreach (var f in Filtermodel.InstrumentsFilterList.Where(s => s.isActive))
        {
          int temp = f.InstrumentID;
          inner = inner.Or(ud => ud.InstrumentId == temp);
        }

为什么我必须使用temp变量呢?我尝试使用"f“迭代器变量,但是每次迭代它只得到列表中的最后一个值,就像它是通过引用传递的一样……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-27 09:50:29

因为PredicateBuilder正在构建一个表达式,该表达式将在稍后的某个时间点执行。当编译器为委托生成闭包时,它会找到在当前作用域中创建的任何值,并将它们带到闭包中。由于InstrumentID是一个值类型(int),初始化和复制值意味着每个委托/闭包都将携带该值。如果不是每次都创建该值的副本,则表达式将只有一个对f.InstrumentID的文字引用,而不是对其底层值的引用。因此,稍后,当表达式实际执行时,f.InstrumentID将被求值,结果将是上次设置的值,也就是最后一次迭代。

票数 10
EN

Stack Overflow用户

发布于 2009-10-27 09:50:52

因为它不是在计算条件,而是简单地构建表达式。该表达式绑定到foreach中定义的变量,该变量在整个循环的执行过程中都保留了它的引用。使用临时变量重新定义它会强制每个表达式使用不同的变量,这会强制它使用每次迭代时的值引用实例,而不是让所有迭代都引用单个引用并仅具有最后一次迭代的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1628314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档