2014-12-09 10 views
8

Sono consapevole di this domanda, ma quello che vorrei fare è ottenere qualcosa di simile a questo generato SQL:Get max e min da Entity Framework, in una query e con la migliore ricerca possibile

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

quando provo questo:

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

l'SQL generato è simile al seguente:

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) 

ho anche provato thi s:

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 }; 

che dà questo:

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] 

Entrambi lavorano, e il calo di prestazioni è probabilmente irrilevante, quindi è per lo più estetico:
Le due query generati entrambi male i miei occhi.

+0

Che cosa succede se si scrive 'Gruppo D dal vero in grp'? – Magnus

+0

@Magnus, poca/nessuna differenza – Benjol

risposta

-4
var query = from d in db.Table 
      where d.Id == 1 
      select 
      {  
       d.Max(t =>t.yourColName), 
       d.Min(t =>t.yourColName) 
      }; 
+2

Fornire una spiegazione del motivo per cui il codice –

+0

Nel codice sopra riportato dalla tabella, selezionare innanzitutto i record associati a d.Id == 1, quindi selezionare come richiesto. Colonna Max e Min. – Dane

+2

Non sono l'OP, sto solo dando consigli su come migliorare la risposta invece di avere solo il codice nella risposta senza una spiegazione (per l'OP e le persone future che cercano una risposta) –

5

Provare a rimuovere le let dichiarazioni - i risultati qui sotto produce attesi: SQL

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

risultante:

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]