【发布时间】:2022-01-13 08:49:06
【问题描述】:
我有一些复杂的场景,但我会在这里简单地展示它们。所以,我的上下文类非常简单:
public class AppDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("data source=DILSHODKPC;integrated security=True;Database=ODataTEst; MultipleActiveResultSets=true");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var student = modelBuilder.Entity<Student>();
student.HasKey(s => s.Id);
}
public IQueryable<T> GetEntities<T>() where T : class
{
return Set<T>();
}
}
我的模型也很简单:
public class Student
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Score { get; set; }
}
我在数据库中有 8 条记录:
我的问题是当我向现有实体框架添加查询时正在跟踪所有实体。看两个场景:
场景 1:
AppDbContext appDbContext = new AppDbContext();
var query1 = appDbContext.GetEntities<Student>().Where(s => s.Score > 3);
var query2 = query1.Where(s => s.Name == "Messi");
var loadedEntitiesCount = query2.ToList().Count();//Count is 4. It is good
var trackedEntitiesCount = appDbContext.ChangeTracker.Entries<Student>().Select(e => e.Entity).Count();//Count is 4. It is good
在这种情况下,一切都在意料之中。
场景 2:
static void Main(string[] args)
{
AppDbContext appDbContext = new AppDbContext();
var query1 = GetFirstQuery(appDbContext);
var query2 = query1.Where(s => s.Name == "Messi");
var loadedEntitiesCount = query2.ToList().Count();//Count is 4. It is good
var trackedEntitiesCount = appDbContext.ChangeTracker.Entries<Student>().Select(e => e.Entity).Count();//Count is 8. Confusing
}
static IEnumerable<Student> GetFirstQuery(AppDbContext appDbContext)
{
return appDbContext.GetEntities<Student>().Where(s => s.Score > 3);
}
在这种情况下,跟踪的实体数为 8。我没想到
场景 3:
AppDbContext appDbContext = new AppDbContext();
var query1 = GetFirstQuery(appDbContext).AsQueryable();
var query2 = query1.Where(s => s.Name == "Messi");
var loadedEntitiesCount = query2.ToList().Count();//Count is 4. It is good
var trackedEntitiesCount = appDbContext.ChangeTracker.Entries<Student>().Select(e => e.Entity).Count();//Count is 4. It is good
跟踪的实体数为 4。
问题是为什么 ef 跟踪场景 2 中的所有实体?这是预期的吗?在具有不同类型集合的现有查询上添加查询的最佳实践是什么? (IEnumerable, IQueryable)
【问题讨论】:
标签: c# entity-framework-core iqueryable