实体框架排除字段查询计数和POCO的最佳方式
本文关键字:POCO 最佳 方式 框架 排除 字段 查询 实体 | 更新日期: 2023-09-27 18:18:04
我创建了一个qr
对象来获取总项目计数,而不需要从数据库中获取所有数据,并且必要时还可以选择MyViewModel
列表
var qr = dbSet.Select(o =>
new { ParentID = o.Parent.ID, o.Parent.Name, o.ID})
.Select(o => new MyViewModel(o.ParentID, o.Name, o.ID));
但是当我尝试qr.Count()
和qr.ToList()
时,它们都在数据库中运行相同的查询,这不仅是针对项目的计数。
什么是最好和最快的方式来获得'MyViewModel'项目'本身或项目'计数或两者在同一时间?
这个查询的问题是因为它在
中调用了MyViewModel的构造函数.Select(o => new MyViewModel(o.ParentID, o.Name, o.ID))
这个调用有效地将IQueryable转换为IEnumerable,因为不可能从查询调用构造函数。
要避免这种转换,请使用对象初始化器而不是构造函数:
.Select(o => new MyViewModel
{
ParentID = o.ParentID,
Name = o.Name,
ID = o.ID
})
您在linq查询中有.AsEnumerable()
调用。这意味着任何将查询转换为SQL的操作都将在此停止,之后的任何内容都不会被转换为SQL。因此,将在数据库中运行的唯一查询是检索完整的dbSet
。如果只想检索计数,则运行以下linq查询
var qrCount = dbSet.Count();