Entity Framework Rückgabe von eindeutigen Datensätzen Problem
Ich habe ein PC-Enity, die haben einige Eigenschaften , die ich möchte, um eine Liste von bestimmten Objekts (PC oder Komplexen Typ oder was auch immer ) basierend auf einer Eigenschaft, um es zu binden, um server-Steuerelemente DropDownList . Und Da meine Methode befindet sich in der BLL kann ich nicht mehr zurück anonymer Typ , So habe ich eine Filiale ComplexType, die zwei peroperties.
Schrieb ich gerne, aber es haben repeative Datensätze:
List<Branch> result = ( from p in _context.PCs
where p.UserId== userId
select new Branch()
{
BranchId= p.BranchId,
BranchName=p.BranchName
}).Distinct().ToList();
Edit :
Danke Euch allen , Das hat funktioniert :
List<PC> result = _context.PCs
.GroupBy(p=>p.BranchName , p.BranchId})
.select(g=>g.First())
.ToList();
Meinst du, dass Sie zwei Elemente in der
Ja Sie es richtig
Verwenden Sie SQL Server? Wenn ja, welche version? Wenn Nein, welche Datenbank?
SQL Server 2008
Das ist merkwürdig. Ich habe gerade getestet Ihre Abfrage und es funktioniert für mich, siehe meine Antwort unten. Wie auch immer, Sie haben bereits eine funktionierende Lösung...
result
Liste, die gleich in beiden BranchId
UND BranchName
? Das wäre verwunderlich, denn das sollte nicht passieren mit deinem Beispiel.Ja Sie es richtig
Verwenden Sie SQL Server? Wenn ja, welche version? Wenn Nein, welche Datenbank?
SQL Server 2008
Das ist merkwürdig. Ich habe gerade getestet Ihre Abfrage und es funktioniert für mich, siehe meine Antwort unten. Wie auch immer, Sie haben bereits eine funktionierende Lösung...
InformationsquelleAutor Mostafa | 2012-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
zurückkehren unterschiedliche Zeilen für alle Spalten in der select-Anweisung. Wenn Sie möchten, unterschiedliche Zeilen einer bestimmten Spalte nur festlegen, dass bei bestimmten Spalte
Wenn Sie möchten, um verschiedene Werte aus mehreren Spalten, dann müssen Sie erstellen Sie eine Gruppe und wählen Sie dann den ersten Wert aus dieser Gruppe. In diesem Fall werden Sie nicht verwenden Sie Unterschiedliche, zum Beispiel
ersetzen BranchId, mit BranchName in der ersten statemet
Die zweite hat nicht funktioniert entweder . Es compile-Zeit-Fehler : kann Nicht konvertiert werden Quelltyp System.Sammlung.Generisches.Liste<...Pc - > Ziel-Typ-System.Sammlung.Generisches.Liste<...Branch>
versuchen Sie es auch , Aber es haben repeative Datensätze zu
ändern Sie einfach die zweite Aussage, die vergessen haben, geben Zweig wählen Sie neu Kontoauszug, versuchen Sie es jetzt
InformationsquelleAutor Habib
Ich kann nicht reproduzieren Sie das problem (getestet mit SQL Server 2008 R2 und EF 4.1/DbContext). Die Abfrage in deiner Frage...
... erzeugt folgende SQL:
Es ist ein DISTINCT auf beide Spalten und ich bekomme das erwartet deutliche Ergebnis - keine Duplikate in
BranchId
undBranchName
.InformationsquelleAutor Slauma
Bekommen Sie Duplikate, weil Distinct() nicht in der Lage ist zu erkennen, zwei von Ihren komplexen Branch-Objekte als identisch in Ihren Eigenschaften. Es wird nur vergleichen für Objekt-Gleichheit, die den Wert false zurück (weil Sie zwei verschiedene Objekte, aber mit den gleichen Werten).
Können Sie Distinct(IQueryable, IEqualityComparer) Ihre eigenen Comparer oder die Umsetzung des IEquatable - Schnittstelle.
Distinct
vonIQueryable<T>
), nicht LINQ to Objects (Distinct
vonIEnumerable<T>
). Das Objekt der Geschlechter-Vergleich gilt nicht in diesem Fall.Sie sind im Recht guten Ruf. Falsche Distinct() hier. Aber wäre es nicht bietet eine IEqualityComparer noch zu beheben sein problem?
Nein, weil die überlastung der
Distinct
welche dieIEqualityComparer
wird nicht unterstützt LINQ to Entities. Ich bin eigentlich sehr verwirrt, warum das Beispiel in der Frage funktioniert nicht. Ich werde es testen...InformationsquelleAutor magnattic
Dies funktioniert für mich.
1.
2.
3.
InformationsquelleAutor Joma