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

时间:2014-08-15 12:33:55

标签: c# linq entity-framework lambda poco

我创建了一个qr对象来获取总项目数而不从数据库获取所有数据,并且如果有必要还选择MyViewModel list

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”的最佳和最快捷方式是什么?项目'本身或物品'同时计算或同时计算两者?

2 个答案:

答案 0 :(得分:0)

您在linq查询中调用.AsEnumerable()。这意味着任何translate-your-query-into-SQL都会在那里停止,之后的任何内容都不会被转换为SQL。因此,将在您的数据库中运行的唯一查询是检索完成dbSet。如果您只想检索计数,请运行以下linq查询

var qrCount = dbSet.Count();

答案 1 :(得分:0)

此查询的问题是因为它在

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