2010-03-12 17 views
5

Hier ist meine LINQ-Abfrage:SortiertNach und Distinct mit LINQ-to-Entities

(from o in entities.MyTable 
orderby o.MyColumn 
select o.MyColumn).Distinct(); 

Hier ist das Ergebnis:

{"a", "c", "b", "d"} 

Hier ist die erzeugte SQL:

SELECT 
[Distinct1].[MyColumn] AS [MyColumn] 
FROM (SELECT DISTINCT 
    [Extent1].[MyColumn] AS [MyColumn] 
    FROM [dbo].[MyTable] AS [Extent1] 
) AS [Distinct1] 

Ist das ein Fehler? Wo ist meine Bestellung, verdammt?

Antwort

10

Sie sollten nachDistinct sortieren, wie es mit keiner Garantie kommt über den Auftrag zu bewahren:

entities.MyTable.Select(o => o.MyColumn).Distinct().OrderBy(o => o); 
+0

Dieser Code wird nicht kompiliert. OrderBy gibt den Fehler: 'Die Typargumente können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben. –

+0

Oh ich sehe, es muss 'OrderBy (o => o)' sein, da zu diesem Zeitpunkt die Elemente bereits ausgewählt wurden (und wir arbeiten mit einem 'IQueryable '). Ich habe Ihren Code korrigiert und Ihnen das Häkchen gegeben - Danke! –

+0

@BlueRaja: Ja, das habe ich verpasst. Danke für die Korrektur! –

1

Diese Frage, die Regeln für Linq zu Objekten diskutiert: Preserving order with LINQ

In der Datenbank, noch weniger Operationen erhalten Ordnung. Niemand behält die Reihenfolge bei der Unterscheidung bei (in der Regel wird ein Hash-Algorithmus verwendet).

+0

Noch funktioniert die Abfrage 'SELECT DISTINCT ... ORDER BY ...' wie Sie es in SQL Server erwarten und wahrscheinlich in anderen DBMS - gibt es einen Grund, dass die 'ortby' LINQ-Klausel in diesem Fall beim Generieren einfach ignoriert wird die SQL (könnte es zumindest einen Fehler werfen)? Ich denke immer noch, dass dies ein Fehler ist - die LINQ-Abfrage funktioniert korrekt, wenn sie auf einem 'String []' verwendet wird. –

+0

Wenn Sie den Abfrageplan überprüfen, wird angezeigt, dass das ORDER BY nach dem DISTINCT auftritt. Daher gibt es strenge Einschränkungen für das, was in ORDER BY angezeigt werden kann. Dies ist nur ein weiterer Fall, in dem SQL-Syntax zu Verwirrung führt. –

+0

Was ist der "Abfrageplan" und wie sehe ich ihn? Ich habe diese Abfrage oben mit SQL Server 2008 Profiler erhalten, aber es gibt Ihnen offensichtlich nur die letzte Abfrage. –