J'ai une requête LINQ complexe (en utilisant LINQ 2 EF) qui peut renvoyer des résultats en double et j'utilise donc la méthode .Distinct()
pour éviter les doublons. Voici le squelette:LINQ Sélectionnez Distinct en ignorant le champ XML
var subQuery1 = // one query...
var subQuery2 = // another query...
var result = subQuery1.Distinct().Union(subQuery2.Distinct()).ToArray();
Chacune des requêtes sous joindre à une table utilisateur commune avec une autre table et effectuer une « où » la requête, les résultats sont ensuite combinés dans le .Union(...)
. Cela a bien fonctionné jusqu'à ce que la table a été modifiée pour inclure une colonne XML, ce qui conduit à cette exception:
le type de données XML ne peut pas être sélectionné comme distinct car il n'est pas comparable
Dans ce cas, je ne se soucie pas si la colonne XML est équivalente à travers les résultats. En fait, j'ai seulement besoin d'être assuré que la clé primaire UserId
est distincte dans les résultats.
Existe-t-il un moyen d'utiliser Distinct()
mais ignorer la colonne XML ou un moyen plus simple d'assurer que je supprime des enregistrements du résultat avec le même UserId
d'une manière efficace? Idéalement, cela ne permettrait pas de récupérer les enregistrements en double de la base de données et ne nécessiterait pas de post-traitement pour supprimer les doublons.
Mise à jour: J'ai découvert que si je sérialiser mes requêtes aux tableaux à l'avance alors il n'y a pas besoin de tout type de comparateur depuis Linq2Objects n'a pas le problème de sélection distincte XML. Par exemple, je peux le faire:
var subQuery1 = // one query...
var subQuery2 = // another query...
var result =
subQuery1.Distinct().ToArray().Union(
subQuery2.Distinct().ToArray())
.ToArray();
Ce que je cherche vraiment est un moyen d'éviter sérialisation des requêtes intermédiaires et faire un Linq2Entities appeler directement qui ne sera pas chercher les enregistrements en double avec UserId
s. Merci pour toutes les réponses jusqu'à présent.
Pas une réponse à un problème exact, mais dans le cas en général si vous voulez 'Distinct' avec une concaténation, utilisez directement' Union'. Définir des opérations comme 'Union',' Except', 'Intersect' etc supprime les doublons de toute façon. Donc dans votre cas, juste: 'subQuery1.Union (subQuery2) .ToArray()' – nawfal