简体   繁体   中英

EF Core 2.1 Group By for Views

I have a view in SQL lets call it MyCustomView .

If I was to write a simple SQL query to count and sum I could do something like: SELECT COUNT(*), SUM(ISNULL(ValueA, ValueB)) FROM MyCustomView

Is it possible to translate that query in EF Core?
Diggin around I found the answers mentioning the user of GroupBy 1 (however this doesn't seem to work for views), ie

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

The issue I am having is that whenever I attempt to run the query I get a complaint about having to run the group by on the client.
However If I was to replace the .Query<MyCustomView>() with a DbSet property from the context then that query works fine. So I am guessing it has to do with the fact that I am trying to execute the operation on a View.
Is there a way to achieve this behaviour with a View or am I out of luck again with EF Core :(

Querying Views are notoriously slow when they are not indexed. Instead you can convert your View results into a list first, then query that list. It will eliminate the querying the view on the SQL side and should speed up the overall process.

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

I will say, the proper solution (if you can do it) is to index the view.

For anyone that is curious (or until someone else manages to provide an anwser) I managed to get it work by creating a linq query like this:

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();

Also according the EF Core team this has been sorted in EF Core 3+, unfortunately I haven't got the luxury to upgrade to 3.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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