TL; DR
new List<double?> { o.M01, o.M02, o.M03, o.M04, o.M05 }.OrderBy(p => p).ToList()
Diese Umfrage funktioniert nur mit der von Ihnen bereitgestellten Stichprobe, löst Ihr Problem jedoch nicht, wie @GertArnold auf die Kommentare hingewiesen hat.
Stattdessen können Sie nicht nach einer Liste suchen, sondern eine neue Entität mit den gewünschten Spalten zurückgeben. Nachdem Sie das Ergebnis materialisiert haben, können Sie es in eine Liste umwandeln.
var results =
db.Entities.Where(o => o.Version == 1)
.Select(o => new { M01 = o.M01, M02 = o.M02, M03 = o.M03, M04 = o.M04, M05 = o.M05 });
return results.Select(o => new List<double?> { o.M01, o.M02, o.M03, o.M04, o.M05 });
Nun ist die Argumentation:
Ihre EF-Abfrage generiert die folgende (wirklich chaotisch) SQL-Anweisung:
SELECT
[Project6].[Id] AS [Id],
[Project6].[C2] AS [C1],
[Project6].[C1] AS [C2]
FROM (
SELECT
CASE
WHEN ([UnionAll4].[C1] = 0) THEN [Extent1].[M01]
WHEN ([UnionAll4].[C1] = 1) THEN [Extent1].[M02]
WHEN ([UnionAll4].[C1] = 2) THEN [Extent1].[M03]
WHEN ([UnionAll4].[C1] = 3) THEN [Extent1].[M04]
ELSE [Extent1].[M05] END AS [C1],
[Extent1].[Id] AS [Id],
1 AS [C2]
FROM [dbo].[Entities] AS [Extent1]
CROSS JOIN (
SELECT 0 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable1]
UNION ALL
SELECT 1 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable2]
UNION ALL
SELECT 2 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable3]
UNION ALL
SELECT 3 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable4]
UNION ALL
SELECT 4 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable5]
) AS [UnionAll4]
WHERE 1 = [Extent1].[Version]
) AS [Project6]
ORDER BY [Project6].[Id] ASC, [Project6].[C2] ASC
Wie Sie auf der ORDER BY-Klausel sehen können, die Abfrage Aufträge von [Project6]. [C2], was nur ein Kontroll-Flag ist, das 1 zurückgibt. Dies liegt daran, dass Sie, wie in den Kommentaren angegeben, @marc_s nicht explizit eine Reihenfolge für Ihre Ergebnisse angegeben haben.
Wenn du stattdessen verwenden somenting wie:
var results = db.Entities.Where (o => o.Version == 1) .Select (o => neue Liste {o. M01, o.M02, o.M03, o.M04, o.M05} .OrderBy (p => p) .ToList());
... dann würde das generierte SQL die korrekte Bestellklausel enthalten und Sie würden das erhaltene Ergebnis erhalten.
var results =
db.Entities.Where(o => o.Version == 1)
.Select(o => new { M01 = o.M01, M02 = o.M02, M03 = o.M03, M04 = o.M04, M05 = o.M05 });
return results.Select(o => new List<double?> { o.M01, o.M02, o.M03, o.M04, o.M05 });
... dann würden Sie nicht mit dem generierten SQL, um stören müssen und die Kontrolle über den Auftrag haben, würde Ihre Spalten auf der Ausgabeliste zurückgegeben werden.
Und wie generierte SQL Abfragen in beiden Fällen aussieht? – Reniuz
Da Sie nicht explizit nach einer bestimmten Reihenfolge fragen und gegen SQL Server vorgehen, ist die Reihenfolge, in der die Werte zurückgegeben werden, ** nicht definiert ** - SQL Server kann sie kostenlos zurückgeben jede Bestellung, die es tun könnte. Wenn Sie ** ** bestellen müssen - dann müssen Sie ** explizit definieren ** - mit einem '.OrderBy' in EF oder einem' ORDER BY' In T-SQL –