繁体   English   中英

EF Core 2.1分组依据

[英]EF Core 2.1 Group By for Views

我在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来运气:(

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

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

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

对于任何好奇的人(或者直到有人设法提供答案),我都设法通过创建如下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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM