我在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实现运气:(
答案 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的奢望。