Ich habe eine komplexe LINQ-Abfrage (mit LINQ 2 EF), die doppelte Ergebnisse zurückgeben kann, und ich verwende daher die .Distinct()
-Methode, um Duplikate zu vermeiden. Hier ist das Skelett:LINQ Select Distinct beim Ignorieren des XML-Felds
var subQuery1 = // one query...
var subQuery2 = // another query...
var result = subQuery1.Distinct().Union(subQuery2.Distinct()).ToArray();
Jede der Unterabfragen eine gemeinsame Benutzertabelle mit einer anderen Tabelle und führen Sie eine ‚wo‘ Abfrage werden die Ergebnisse kombiniert später im .Union(...)
. Das funktionierte gut, bis die Tabelle geändert wurde eine XML-Spalte enthält, das in dieser Ausnahme ergibt:
der XML-Datentyp nicht als verschieden gewählt werden kann, weil sie nicht vergleichbar sind
In diesem Fall I Es ist mir egal, ob die XML-Spalte über die Ergebnisse hinweg äquivalent ist. eigentlich muss ich nur sicher sein, dass der Primärschlüssel UserId
in den Ergebnissen eindeutig ist.
Gibt es eine Möglichkeit, Distinct()
zu verwenden, aber die XML-Spalte zu ignorieren oder einen einfacheren Weg, um sicherzustellen, dass ich Datensätze aus dem Ergebnis mit der gleichen UserId
auf effiziente Weise entfernen? Idealerweise würde dies doppelte Datensätze nicht aus der Datenbank abrufen und würde keine Nachbearbeitung erfordern, um die Duplikate zu entfernen.
Update: Ich habe herausgefunden, dass, wenn ich meine Fragen serialisiert vor der Zeit auf Arrays dann gibt es keine Notwendigkeit, da Linq2Objects für jede Art von Vergleich ist nicht das XML eindeutige Auswahl Problem. Zum Beispiel kann ich dies tun:
var subQuery1 = // one query...
var subQuery2 = // another query...
var result =
subQuery1.Distinct().ToArray().Union(
subQuery2.Distinct().ToArray())
.ToArray();
Also, was ich mich wirklich für einen Weg, um die Zwischenabfragen zu vermeiden, ist die Serialisierung und tut ein Linq2Entities ruft direkt das wird nicht mit doppelten UserId
Unterlagen holen. Danke für alle bisherigen Antworten.
Keine Antwort auf genaues Problem, aber im Allgemeinen, wenn Sie 'Distinct' mit einigen Verkettungen wollen, verwenden Sie direkt 'Union'. Setze Operationen wie 'Union', 'Ausgenommen', 'Schneiden' usw. entfernt sowieso Duplikate. Also in Ihrem Fall, nur: 'subQuery1.Union (subQuery2) .ToArray()' – nawfal