我使用 PredicateBuilder,如下所示http://www.albahari.com/nutshell/predicatebuilder.aspx http://www.albahari.com/nutshell/predicatebuilder.aspx,一切都很好,现在我可以生成动态 LINQ to 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);
}
为什么我必须使用该临时变量?,我尝试使用“f”迭代器变量,但它只获取每次迭代列表中的最后一个值,就像它是通过引用传递的一样...
因为 PredicateBuilder 正在构建一个表达式,该表达式将在稍后的时间点执行。当编译器为委托生成闭包时,它会查找在当前作用域中创建的任何值,并将它们也带入闭包中。由于 InstrumentID 是值类型 (int),因此初始化和复制该值意味着每个委托/闭包都将携带该值。如果您不是每次都创建值的副本,则表达式将仅具有对 f.InstrumentID 的字面引用,而不是对其基础值的引用。因此,稍后,当实际执行表达式时,将对 f.InstrumentID 进行求值,并且它将显示为上次设置的值,即最后一次迭代。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)