2016-06-04 11 views
-4

Ich kann keine eindeutige Liste von 'Order' aus meiner Lambda-Abfrage erhalten. Obwohl das Schlüsselwort Distinct() verwendet wird, gibt es immer noch wiederholte Auswahllistenelemente zurück.Lambda Distinct funktioniert nicht

public ActionResult Index() 
{ 
     var query = _dbContext.Orders 
            .ToList() 
            .Select(x => new SelectListItem 
            { 
             Text = x.OrderID.ToString(), 
             Value = x.ShipCity 
            }) 
            .OrderBy(y => y.Value) 
            .Distinct(); 

     ViewBag.DropDownValues = new SelectList(query, "Text", "Value"); 

     return View(); 
} 

Irgendwelche Vorschläge bitte?

UPDATE

Sorry Leute ich die Distinct() von meinem Code wirklich verpasst. Ich habe es jetzt meinem Code hinzugefügt.

Ich versuche im Grunde alle eindeutigen Zeilen zu bekommen, wo ja die Werte gleich sind, aber die IDs sind unterschiedlich.

Genau wie diese SQL Query ......

SELECT distinct [ShipCity] FROM [northwind].[dbo].[Orders] ORDER by ShipCity 
+8

hat Ihr Code * Null * ruft 'Distinct()'. –

+1

Auch einige allgemeine Hinweise bei der Verwendung von Entity-Framework (ich gehe davon aus, dass _dbContext EF-Kontext ist): Call ToList() sollte das letzte sein, was Sie tun. Das gleiche gilt für Single(), First(), Last(), Any(), Count() etc ... Sie bekommen den Punkt ... EF ist "schlau" genug, um nicht zu DB zu reisen, bis es muss . SO ... Wenn Sie Ihre Where(), Select(), OrderBy() usw. vor dem Aufrufen von Aufrufen der Liste ausführen, werden Sie viel effizienter. Ich würde Ihnen raten, etwas mehr über Entity Framework zu lesen. – Igor

+0

Bitte senden Sie den Code mit dem Distinct Anruf. Wir müssen verstehen, was Sie versucht haben oder zu erreichen versuchen. –

Antwort

1

Ich gehe davon aus Sie unterscheidet sich von dem Ende der Abfrage entfernt.

Eigentlich sehe ich nicht, wie Sie überhaupt doppelte Aufträge erhalten konnten, da Sie nichts in Ihrer Abfrage tun, außer die Auswahl und Ihre Abfrage ist auf einer Tabelle in einer Datenbank, so dass Sie bereits nicht erhalten die gleiche Zeile mehrere Zeit.

Was nennen Sie ein "Duplikat"? Wenn Sie zwei Zeilen mit denselben Werten außer ihrer ID meinen, die überhaupt kein Duplikat ist, sind das nur zwei nicht verwandte Zeilen mit den gleichen Werten. . .

Wenn Sie andererseits meinen, Sie erwarten, dass sie gleich sind, weil Sie die .Distinct nach der Auswahl werfen und Sie nur OrderId und ShipCity dort verwenden, für die es Duplikate gibt (und ich wirklich nicht ' t, warum eine Spalte namens OrderId in einer Ordertabelle Duplikate enthalten sollte, aber das ist ein anderes Problem), funktioniert dann immer noch nicht, weil Sie weder OrderId noch ShipCity auswählen, ein neues SelectListItem auswählen und zwei Referenztypen erstellen Mit demselben Wert sind sie in .NET nicht gleich, sie müssen dieselbe Instanz sein, um gleich zu sein, nicht zwei Instanzen mit unterschiedlichen Werten.

nach Ihrem Kommentar bearbeitet:

var query = _dbContext.Orders 
           .ToList() 
           // Group them by what you want to "distint" on 
           .GroupBy(item=>item.ShipCity) 
           // For each of those groups grab the first item, we just faked a distinct) 
           .Select(item=>item.First()) 
           .Select(x => new SelectListItem 
           { 
            Text = x.OrderID.ToString(), 
            Value = x.ShipCity 
           }) 
           .OrderBy(y => y.Value) 
           .Distinct(); 
+0

Hallo Ronan Ich habe meinen Code mit 'Distinct()' aktualisiert und ich hatte es aus meinem Code entfernt, wie Sie oben erwähnt haben. Im Grunde versuche ich, alle eindeutigen Reihen von der DB zu erhalten, in der, wie du erwähnst, der gleiche Wert von den verschiedenen Id teilen. So etwas wie diese Abfrage 'SELECT distinct [ShipCity] FROM [Nordwind]. [Dbo]. [Aufträge] ORDER by ShipCity' Hoffentlich macht es das deutlicher? – Kevin

+0

@Kevin Ja, aber das kann man nicht mit linq einbauen, es gibt kein "DistinctBy", mit dem man etwas durch ein Feld anders machen kann als durch das ganze Objekt (oder Zeile auf DB-Seite). Sie können jedoch mit groupby schummeln, indem Sie meine Antwort jetzt mit einem Beispiel bearbeiten, das Ihrer Anfrage entspricht –

+0

Danke @Ronan für die Erklärung. Das hat das Problem gelöst :) – Kevin

Verwandte Themen