Tra*_*s J 4 .net c# linq linq-to-entities entity-framework
使用Entity Framework,并将DbContext包装在如下的类中:
public class Demo : IDisposable
{
internal DbContext context;
internal int PrivateId = 5;
public Demo()
{
this.context = new MyDbContext();
}
public void Question()
{
//Is there going to be a problem using `this` in the predicate
var issue = this.context.SomeTable.Where(st => st.ForeignKeyId == this.PrivateId);
}
public Dispose()
{
this.context.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
这就像我想出的那样简单.我不确定this当用作谓词的一部分时是否会以某种方式被更改或修改Where.基本上我只是想仔细检查,因为我不确定.我查看了Jon Skeet的重新实施,Where但仍然不完全清楚它this会保留其价值.
我的不确定性源于谓词在Func延迟执行时使用的问题.结果,似乎this可以在稍后的时间使用引用,而不是在Where被调用时立即使用.
我是在过度思考这种情况,还是有可能this改变?
this是只读的(对于参考类型).您无法更改引用this所指的内容.存储在this变量中的引用所引用的对象实际上可能随时间而变化.
因此,您可以确定,对于该代码,无论何时实际执行它都将使用对象的当前实例,并且您最终不会引用一些完全不同的Demo对象.然后它将转到该实例并在该时刻获取其PrivateId变量的值.因此,如果已针对该特定实例进行了更改,则更改的值将是使用的值.PrivateId
这与Where引用类型的语义和延迟执行的整个概念的实现没有任何关系.
如果你想使用的价值PrivateId ,现在,不序时,实际上是重复,那么仅仅是变量的值复制到了一些新的变量,并关闭了那个,就像这样:
var idCopy = this.PrivateId;
var issue = this.context.SomeTable.Where(st => st.ForeignKeyId == idCopy );
Run Code Online (Sandbox Code Playgroud)