I have the following LINQ to Entities query which has many subqueries to get some aggregate data:
var systems = from s in db.Systems
orderby s.Name
select new SystemSummary
{
Id = s.Id,
Code = s.Code,
Name = s.Name,
LastException = (
from a in s.Applications
from e in a.Summaries
select e.CreationDate
).Max(),
TodaysExceptions = (
from a in s.Applications
from e in a.Summaries
where e.CreationDate >= today && e.CreationDate < tomorrow
select e
).Count(),
/* SNIP - 10-15 more subqueries */
};
I shortened up the query to only include 2 of the subqueries, but there could be around 10-15 more of them. Is there a way that I can refactor the query to clean up the code? I'm not looking for a performance increase. I want to just clean up the code by maybe putting the subqueries into separate methods while still making sure that it is a single call to the database. Is this possible?
I just can offer minimize its length by something like this (by using let
keyword in your original query):
var subQuery = from a in s.Applications
from e in a.Summaries
select e;
Also you can have some refactors like:
subQuery.Count(e=>e.CreationDate >= today && e.CreationDate < tomorrow);
subQuery.max(e=>e.CreationDate);
In fact use dot notation and move your query to related function instead of extra where
clause.
and use subQuery
in your query:
from s in db.Systems
orderby s.Name
let subQuery = from a in s.Applications
from e in a.Summaries
select e
select new SystemSummary
{
Id = s.Id,
Code = s.Code,
Name = s.Name,
LastException = subQuery.max(e=>e.CreationDate),
TodaysExceptions = subQuery.Count(e=>e.CreationDate >= today
&& e.CreationDate < tomorrow),
/* SNIP - 10-15 more subqueries */
};
This is still single call to db.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With