实体框架排除字段查询计数和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'项目'本身或项目'计数或两者在同一时间?

实体框架排除字段查询计数和POCO的最佳方式

这个查询的问题是因为它在

中调用了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();