我使用的是PredicateBuilder,如http://www.albahari.com/nutshell/predicatebuilder.aspx所示,一切正常,现在我可以将Dynamic LINQ生成为SQL表达式,但是我不明白的是为什么当我在这样的循环中:

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”迭代器变量,但它每次迭代仅获得列表中的最后一个值,就像它是通过引用传递的一样。

最佳答案

因为PredicateBuilder正在构建一个表达式,该表达式将在以后的某个时间点执行。当编译器为委托(delegate)生成闭包时,它会找到在当前作用域中创建的所有值,并将它们也带入闭包中。由于InstrumentID是一种值类型(int),因此初始化和复制该值意味着每个委托(delegate)/关闭都将携带该值。如果您不是每次都创建该值的副本,则该表达式将仅具有f.InstrumentID的文字引用,而不是其基础值。因此,稍后,当实际执行该表达式时,将对f.InstrumentID进行求值,并以最后设置的值(即最后一次迭代)的形式显示出来。

关于linq-to-sql - LINQ to SQL PredicateBuilder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1628314/

10-13 00:52