2016-05-07 6 views
1

Ich habe Probleme, aktuelle Antworten für die Verwendung von Lambda-Ausdrücke zu finden und eine Liste mit Tabellendaten aus einer Entität nach "Likes" ohne doppelte "Agentur zu sortieren "und nur Top 100 anzeigen.LINQ to Entities Table Top 100 mit eindeutigen Namen

Ich habe Folgendes, aber es funktioniert nicht für eindeutig Ich rate. Jedes Mal, wenn ich es starte und überprüfe, erscheinen immer noch doppelte Agenturnamen. Ich habe keine Ahnung, warum es sich nicht um doppelte Agenturnamen kümmert.

 public PartialViewResult Top100() 
    { 
     List<New_NYC_Usage_Table> data = db.New_NYC_Usage_Table.ToList(); 

     data = db.New_NYC_Usage_Table.Where(x => x.Platform != "TOTAL").ToList(); 
     data = data.OrderByDescending(x => x.Agency).Distinct().ToList(); 
     data = data.OrderByDescending(x => x.Likes_Follows_Etc).Take(100).ToList(); 
     return PartialView("_Data", data); 

    } 

Wenn ich unklar bin oder diese Stelle ist irrelevant oder ein Duplikat Thema in die richtige Richtung zeigen Sie mir bitte oder einem MSDN Verweis oder Link mit hilfreichen Beispielen, danke.

+0

'Distinct()' berücksichtigt nur zwei identische Zeilen. Was erwarten Sie, wenn mehrere Zeilen mit der gleichen 'Agentur' vorhanden sind, nehmen Sie die erste Zeile? – har07

+0

Verwenden Sie nicht '.ToList()' jedes Mal, Sie brauchen es nur in der vorletzten Zeile. Sie wiederholen unnötigerweise die gesamte Liste jedes Mal, wenn Sie das tun. –

Antwort

1

Ich denke, Sie versuchen, eine Liste der Top-100-Agenturen nach Likes, folgt usw. zu bekommen, aber wenn eine Agentur in dieser Liste zweimal ist, gehe ich davon aus, dass Sie nur die höchste Rangliste, nicht beide wollen.

ich denke, das Linq-Abfrage sollte tun, was Sie wollen (obwohl ich nur in der Lage gewesen bin es auf eine ähnliche Tabelle zu testen, so sicher sein, es sorgfältig zu prüfen)

var data = db.New_NYC_Usage_Table.Where(x => x.Platform != "TOTAL") 
.GroupBy(x => x.Agency, (key, g) => g.OrderByDescending(x => x.Likes_Follows_Etc).First()).OrderByDescending(x => x.Likes_Follows_Etc).Take(100).ToList(); 

Hier ist, was geschieht. Ich bekomme alle Datensätze, bei denen die Plattform nicht "TOTAL" ist, und gruppiert sie dann nach Agentur. In jeder Gruppe bekomme ich dann die höchsten Likes, so dass ich in jeder Gruppe nur eine Agentur habe. Ich bestelle dann diese Einträge nach Likes und schließlich die Top 100.

Ich merke in Ihrem Code, dass Sie immer nach jeder Abfrage .toList aufrufen, dies ist oft nicht erforderlich und schadet der Leistung. Sie sollten nur zum letzten möglichen Zeitpunkt anrufen. Ihre Linq-Ausdrücke sind nicht die Datensammlungen, sondern eine Anweisung, was Sie wollen, Sie können diese Anweisung weiter hinzufügen (wie Sie es in Ihrem Code tun, aber ohne die ".toList") und es wird nicht wirklich gehen und Holen Sie die Daten, nur wenn Sie tatsächlich versuchen, die Daten zu betrachten, geht es schließlich und holen Sie es für Sie, es sehr effizient machend. Jedes Mal, wenn Sie .toList aufrufen, fragen Sie nach, dass Ihre Daten ausgewertet werden, aber zu diesem Zeitpunkt ist es Ihnen egal, was da ist. Sie kümmern sich nur darum, was in Ihrem Ergebnis ist.

+0

Hallo Mark_H, vielen Dank, der Code funktioniert, aber anstelle von First() habe ich es wegen eines Fehler in Instanz zu FirstorDefault() geändert und es kann nur als letzte Abfrage verwendet werden.^_ ^ – Roys