首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF Core 2.1 Group By for Views

EF Core 2.1 Group By for Views
EN

Stack Overflow用户
提问于 2019-09-05 07:32:23
回答 2查看 112关注 0票数 1

我在SQL语言中有一个视图,我们称它为MyCustomView

如果我要编写一个简单的SQL查询来计数和求和,我可以这样做:SELECT COUNT(*), SUM(ISNULL(ValueA, ValueB)) FROM MyCustomView

可以在EF Core中翻译该查询吗?

我发现答案提到了GroupBy 1的用户(然而这似乎不适用于视图)。

context .Query<MyCustomView>() .GroupBy(p => 1) .Select(grp => new { count = grp.Count(), total = Sum(p=>p.ValueA ?? p.ValueB)}

我遇到的问题是,每当我尝试运行查询时,都会收到关于必须在客户机上运行group by的抱怨。

但是,如果我将上下文中的.Query<MyCustomView>()属性替换为DbSet属性,那么该查询就可以正常工作。因此,我猜这与我试图在View上执行操作的事实有关。

有没有办法通过视图实现这种行为,或者我在EF Core上又一次走运了:(

EN

回答 2

Stack Overflow用户

发布于 2019-09-05 07:50:25

当没有索引时,查询视图的速度是出了名的慢。相反,您可以先将View结果转换为列表,然后再查询该列表。它将消除在SQL端查询视图的工作,并且应该会加快整个过程。

代码语言:javascript
复制
context
.Query<MyCustomView>()
.ToList()
.GroupBy(p => 1)
.Select(grp => new { count = grp.Count(), total = Sum(p=>p.ValueA ?? p.ValueB)}

我会说,正确的解决方案(如果你能做到的话)是索引视图。

票数 0
EN

Stack Overflow用户

发布于 2019-09-06 10:21:02

对于任何好奇的人(或者在其他人设法提供anwser之前),我设法通过创建如下的linq查询来使其工作:

代码语言:javascript
复制
const a = 1;        
context
.Query<MyCustomView>()
 // For some reason adding the below select lets it execute
.Select(p => new { p.ValueA, p.ValueB })
.GroupBy(p => a)
.Select(grp => new { count = grp.Count(), total = Sum(p=>p.ValueA ?? p.ValueB)})
.First();

根据EF核心团队的说法,这已经在EF核心3+中进行了排序,不幸的是,我没有升级到3的奢侈。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57796725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档