我在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上又一次走运了:(
发布于 2019-09-05 07:50:25
当没有索引时,查询视图的速度是出了名的慢。相反,您可以先将View结果转换为列表,然后再查询该列表。它将消除在SQL端查询视图的工作,并且应该会加快整个过程。
context
.Query<MyCustomView>()
.ToList()
.GroupBy(p => 1)
.Select(grp => new { count = grp.Count(), total = Sum(p=>p.ValueA ?? p.ValueB)}我会说,正确的解决方案(如果你能做到的话)是索引视图。
发布于 2019-09-06 10:21:02
对于任何好奇的人(或者在其他人设法提供anwser之前),我设法通过创建如下的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核心团队的说法,这已经在EF核心3+中进行了排序,不幸的是,我没有升级到3的奢侈。
https://stackoverflow.com/questions/57796725
复制相似问题