16

I'm aware of this question, but what I would like to do is obtain something close to this generated SQL:

select MAX(Column), MIN(Column) from Table WHERE Id = 1

When I try this:

var query = from d in db.Table
            where d.Id == 1
            select new
            {
                min = db.Table.Max(s => s.Column),
                max = db.Table.Min(s => s.Column)
            };

The generated sql looks like this:

SELECT 
    [Extent1].[Id] AS [Id], 
    [GroupBy1].[A1] AS [C1], 
    [GroupBy2].[A1] AS [C2]
    FROM   [dbo].[Table] AS [Extent1]
    CROSS JOIN  (SELECT 
        MAX([Extent2].[Column]) AS [A1]
        FROM [dbo].[Table] AS [Extent2] ) AS [GroupBy1]
    CROSS JOIN  (SELECT 
        MIN([Extent3].[Column]) AS [A1]
        FROM [dbo].[Table] AS [Extent3] ) AS [GroupBy2]
    WHERE ([Extent1].[Id] = 1) AND (1 IS NOT NULL)

I also tried this:

var query = from d in db.Table
           where d.Id == 1
           group d by d.Id into grp
           let min = grp.Min(s => s.Column)
           let max = grp.Max(s => s.Column)
           select new { min, max };

Which gives this:

SELECT 
    [Project2].[Id] AS [Id], 
    [Project2].[C1] AS [C1], 
    [Project2].[C2] AS [C2]
    FROM ( SELECT 
        [Project1].[C1] AS [C1], 
        [Project1].[Id] AS [Id], 
        (SELECT 
            MAX([Extent2].[Column]) AS [A1]
            FROM [dbo].[Table] AS [Extent2]
            WHERE ([Extent2].[Id] = 1) AND (1 IS NOT NULL) AND ([Project1].[Id] = [Extent2].[Id])) AS [C2]
        FROM ( SELECT 
            [GroupBy1].[A1] AS [C1], 
            [GroupBy1].[K1] AS [Id]
            FROM ( SELECT 
                [Extent1].[Id] AS [K1], 
                MIN([Extent1].[Column]) AS [A1]
                FROM [dbo].[Table] AS [Extent1]
                WHERE ([Extent1].[Id] = 16) AND (16 IS NOT NULL)
                GROUP BY [Extent1].[Id]
            )  AS [GroupBy1]
        )  AS [Project1]
    )  AS [Project2]

They both work, and the performance hit is probably negligible, so it's mostly aesthetic:
The two generated queries both hurt my eyes.

Community
  • 1
  • 1
Benjol
  • 63,995
  • 54
  • 186
  • 268

3 Answers3

10

Try removing the let statements - the below produces expected results:

var q = from d in db.Table
        where d.Id == 1
        group d by d.Id into g
        select new
        {
            Id = g.Key, // shown for illustrative purposes
            ColumnMin = g.Min( gi => gi.Column ),
            ColumnMax = g.Max( gi => gi.Column )
        };

var result = q.SingleOrDefault();

Resulting SQL:

SELECT 
    [GroupBy1].[K1] AS [Id],
    [GroupBy1].[A1] AS [C1], 
    [GroupBy1].[A2] AS [C2]
    FROM ( SELECT 
        [Extent1].[Id] AS [K1], 
        MIN([Extent1].[Column]) AS [A1], 
        MAX([Extent1].[Column]) AS [A2]
        FROM [dbo].[Table] AS [Extent1]
        WHERE 1 = [Extent1].[Id]
        GROUP BY [Extent1].[Id]
    )  AS [GroupBy1]
Moho
  • 15,457
  • 1
  • 30
  • 31
6

Here we are, 8 years later! But an answer nonetheless!

db.Table
  .Where(d => d.Id == 1)
  .GroupBy(_ => 1,
    (_, records) => new
                    {
                        Max = records.Max(r => r.Column),
                        Min = records.Min(r => r.Column)
                     });

This results in:

SELECT MAX([o].[Column]) AS [Max], MIN([o].[Column]) AS [Min]
FROM [Table] AS [o]
WHERE [o].[Id] = 1
GO

Note that in "Group by 1" the 1 has nothing to do with the ID from the query!

Bastiaan Linders
  • 1,861
  • 2
  • 13
  • 15
-4
var query = from d in db.Table
            where d.Id == 1
            select
            {     
                d.Max(t =>t.yourColName),  
                d.Min(t =>t.yourColName)  
            };
Magnus
  • 45,362
  • 8
  • 80
  • 118
Dane
  • 20
  • 2
  • In above code from your table first select the records with associated with d.Id==1 , after that select as per your requirement Max and Min Column – Dane Dec 09 '14 at 10:58
  • 2
    I'm not the OP, just giving advice on how you can improve your answer instead of just having code in the answer without an explanation (For the OP and future people looking for an answer) – Bernd Linde Dec 09 '14 at 11:00
  • 2
    Nice, except that it doesn't compile. – Benjol Dec 09 '14 at 14:27