Quantcast
Channel: Entity Framework
Viewing all articles
Browse latest Browse all 10318

Edited Unassigned: Complex query with group by and aggregate function [1090]

$
0
0
(Note for triage: I think this is an important thing to look at in the future)

This complex query was reported by a customer. Given the model:

```
public class SiteHit
{
public int Id { get; set; }
public DateTime DateTime { get; set; }
public string SourceHost { get; set; }
public string TargetHost { get; set; }
}

public class MyContext : DbContext
{
public DbSet<SiteHit> SiteHits { get; set; }
}

```
And the following LINQ query:

```
var query = db.SiteHits.Where(p => p.SourceHost == source && p.DateTime > startDateTime)
.GroupBy(p => new { p.DateTime.Year, p.DateTime.Month, p.DateTime.Day })
.Select(p => new { Date = p.Key, Count = p.Select(s => s.TargetHost).Distinct().Count() });

```
We generate the following SQL that sometimes takes several minutes to process:

```
SELECT
[Project4].[C1] AS [C1],
[Project4].[C2] AS [C2],
[Project4].[C3] AS [C3],
[Project4].[C4] AS [C4],
[Project4].[C5] AS [C5]
FROM ( SELECT
[Project2].[C1] AS [C1],
[Project2].[C2] AS [C2],
[Project2].[C3] AS [C3],
[Project2].[C4] AS [C4],
(SELECT
COUNT(1) AS [A1]
FROM ( SELECT DISTINCT
[Extent2].[TargetHost] AS [TargetHost]
FROM [dbo].[SiteHits] AS [Extent2]
WHERE ((([Extent2].[SourceHost] = @p__linq__0) AND ( NOT ([Extent2].[SourceHost] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent2].[SourceHost] IS NULL) AND (@p__linq__0 IS NULL))) AND ([Extent2].[DateTime] > @p__linq__1) AND (([Project2].[C2] = (DATEPART (year, [Extent2].[DateTime]))) OR (([Project2].[C2] IS NULL) AND (DATEPART (year, [Extent2].[DateTime]) IS NULL))) AND (([Project2].[C3] = (DATEPART (month, [Extent2].[DateTime]))) OR (([Project2].[C3] IS NULL) AND (DATEPART (month, [Extent2].[DateTime]) IS NULL))) AND (([Project2].[C4] = (DATEPART (day, [Extent2].[DateTime]))) OR (([Project2].[C4] IS NULL) AND (DATEPART (day, [Extent2].[DateTime]) IS NULL)))
) AS [Distinct2]) AS [C5]
FROM ( SELECT
[Distinct1].[C1] AS [C1],
[Distinct1].[C2] AS [C2],
[Distinct1].[C3] AS [C3],
[Distinct1].[C4] AS [C4]
FROM ( SELECT DISTINCT
1 AS [C1],
DATEPART (year, [Extent1].[DateTime]) AS [C2],
DATEPART (month, [Extent1].[DateTime]) AS [C3],
DATEPART (day, [Extent1].[DateTime]) AS [C4]
FROM [dbo].[SiteHits] AS [Extent1]
WHERE ((([Extent1].[SourceHost] = @p__linq__0) AND ( NOT ([Extent1].[SourceHost] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[SourceHost] IS NULL) AND (@p__linq__0 IS NULL))) AND ([Extent1].[DateTime] > @p__linq__1)
) AS [Distinct1]
) AS [Project2]
) AS [Project4]
```
The expectation is that we can generate something like this instead:
```
SELECT DATEPART(year, DateTime) Year, DATEPART(month, DateTime) Month, DATEPART(day, DateTime) Day, COUNT(distinct TargetHost) Count
FROM http.SiteHits
WHERE SourceHost=@sourceHost AND DateTime > @startDate
GROUP BY DATEPART(year, DateTime), DATEPART(month, DateTime), DATEPART(day, DateTime)
```

Viewing all articles
Browse latest Browse all 10318

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>