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.
Che cosa succede se si scrive 'Gruppo D dal vero in grp'? – Magnus
@Magnus, poca/nessuna differenza – Benjol