EF Core 2.1分组依据

时间:2019-09-04 23:32:22

标签: c# sql group-by ef-core-2.1

我在SQL中有一个视图,可以称之为MyCustomView

如果我要编写一个简单的SQL查询来进行计数和求和,则可以执行以下操作:SELECT COUNT(*), SUM(ISNULL(ValueA, ValueB)) FROM MyCustomView

是否可以在EF Core中翻译该查询?
在Diggin周围,我找到了提及GroupBy 1用户的答案(但是,这似乎不适用于视图),即

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

我遇到的问题是,每当我尝试运行查询时,都会抱怨必须在客户端上运行group by。
但是,如果我要使用上下文中的DbSet属性替换.Query<MyCustomView>(),则该查询可以正常工作。因此,我猜测这与我试图在View上执行操作有关。
是否有一种方法可以通过View实现此行为,或者我又是否可以使用EF Core实现运气:(

2 个答案:

答案 0 :(得分:0)

众所周知,查询视图没有索引时速度很慢。相反,您可以先将View结果转换为列表,然后查询该列表。它将消除在SQL端查询视图的问题,并应加快整个过程。

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

我会说,正确的解决方案(如果可以的话)是为视图建立索引。

答案 1 :(得分:0)

对于任何好奇的人(或者直到其他人设法提供答案),我设法通过创建如下这样的linq查询来使其起作用:

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 Core团队的说法,该版本已在EF Core 3+中进行了排序,不幸的是,我还没有升级到3的奢望。