我正在将Linq-to-Sql的查询迁移到EF。为了使禁用跟踪更难忘记,在Linq-To-Sql中我写了一个ConfigureForQuery包装器函数,它只是将ObjectTrackingEnabled设置为false。 我想继续使用类似的策略,但根据我目前收集的信息,没有跟踪的全球设置。我想了解如何最好地修复现有查询。一些代码:
public class A {
public int P1 { get; set; }
public int P2 { get; set; }
}
public class B {
public int P3 { get; set; }
public int P4 { get; set; }
}
public class MyDbContext : DbContext {
public IDbSet<A> As { get; set; }
public IDbSet<B> Bs { get; set; }
}
// scenario 1: returning IQueryable of T where IDbSet<T> is defined in a DbContext
public IQueryable<A> Get()
{
var query =
from a in db.As
join b in db.Bs
on a.P1 equals b.P3
where b.P4 > 50
select a;
return query;
}
Q1:我在哪里以及如何申请AsNoTracking?
Q2:在这种情况下,我是否需要将AsNoTracking应用于Bs?
// scenario 2: returning IQueryable of T where IDbSet<T> is NOT defined in a DbContext
public class C {
public int P1 { get; set; }
public int P4 { get; set; }
}
public IQueryable<C> Get()
{
var query =
from a in db.As
join b in db.Bs
on a.P1 equals b.P3
where b.P4 > 50
select C { P1 = a.P1, P4 = b.P4};
return query;
}
问题3:在这种情况下我需要AsNoTracking吗?
感谢您的帮助。
答案 0 :(得分:2)
在第一个场景中,您只需将AsNoTracking
应用于查询结果:
public IQueryable<A> Get() {
var query =
from a in db.As
join b in db.Bs
on a.P1 equals b.P3
where b.P4 > 50
select a;
return query.AsNoTracking();
}
在第二种情况下,由于您返回的内容不在DbContext中,因此无法进行跟踪,因此您无需执行任何操作。
您可以在查询后检查更改跟踪器,以查看正在跟踪的内容以及未跟踪的内容。
var tc = db.ChangeTracker.Entries().Count();