给出以下代码:
A。
using (var context = new testEntities())
{
context.tblAuthors.Select(p => new
{
Author_name = p.Author_name,
Id = p.Id,
country = p.country,
tblBooks = p.tblBooks.Select(z => new
{
Id = z.Id,
Auhthor_id = z.Auhthor_id,
Edition = z.Edition,
Price = z.Price
}).ToList()
}).ToList();
}
B。
using (var context = new testEntities())
{
context.tblAuthors.Include(p => p.tblBooks).AsNoTracking().ToList();
}
我在100个迭代的单独循环中都运行了这两个程序。第一个代码(A)给我平均157ms的执行时间。第二个代码(B)给我平均673ms的执行时间。
我的问题是:
1-为什么Entity Framework有此区别?我以为AsNoTracking()应该和Projection一样执行,因为在两种情况下Context都不跟踪实体。
2-如果要获得最佳性能,是否应该对所有只读操作使用投影而不是AsNoTracking()?
更新1::正在检索的数据量是相同的。我正在使用表格上的所有可用字段。两种代码由Entity Framework生成的查询都是相同的。