JOB*_*OBG 9 linq-to-sql predicatebuilder
我在这里使用PredicateBuilder http://www.albahari.com/nutshell/predicatebuilder.aspx,一切都很好,现在我可以生成动态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);
}
Run Code Online (Sandbox Code Playgroud)
为什么我必须使用那个临时变量?,我尝试使用"f"迭代器变量,但它只获取列表中每个迭代的最后一个值,就像它通过引用传递一样...
Rex*_*x M 10
因为PredicateBuilder正在构建一个表达式,该表达式将在稍后的时间点执行.当编译器为委托生成闭包时,它会找到在当前作用域中创建的任何值,并将它们也带入闭包中.由于InstrumentID是一个值类型(int),初始化和复制值意味着每个委托/闭包都将携带该值.如果每次都不创建值的副本,则表达式将只具有对f.InstrumentID的文字引用,而不是其基础值.所以稍后,当实际执行表达式时,将对f.InstrumentID进行求值,它将作为上次设置的内容出现,这是最后一次迭代.
归档时间: |
|
查看次数: |
1788 次 |
最近记录: |