2012-04-16 2 views
2

J'ai une application Web C# .Net et j'utilise la requête LINQ suivante pour récupérer une liste distincte de propositions qu'un utilisateur a créées ou qui a différents rôles utilisateur. La liste à retourner contient des dupes de la même proposition même après Union et Distinct. Qu'est-ce que je fais mal?LINQ Union and Distinct

 var thereturn = FindAll(DetachedCriteria.For<Proposal>(), 
          new Order("CreateDate", false)); 

    //get the proposals that aUser created 
    IList<Proposal> it = 
       thereturn.Where(proposal => proposal.CreatedBy.Equals(aUser)).ToList(); 

    //get the proposals that aUser is a BOE Author 
    IList<Proposal> it2 = 
      thereturn.Where(proposal => 
       proposal.BOEs.Any(boe => 
        boe.Users.Where(a => a.Name == aUser).Any())).ToList(); 
    //get all other proposals that aUser is on 
    IList<Proposal> it3 = 
      thereturn.Where(proposal => 
       proposal.Users.Where(o => o.Name == aUser).Any()).ToList(); 
    //now union with all other proposals that aUser is on 
    return it3.Union(it).Union(it2). 
       OrderByDescending(o=>o.CreateDate).Distinct().ToList(); 

Répondre

2

Quelle est la définition de la classe Proposal? Vous pouvez rencontrer un problème avec votre opérateur d'égalité par défaut pour la classe Proposal. As msdn says about Distinct:

Retourne des éléments distincts d'une séquence en utilisant le comparateur d'égalité par défaut pour comparer les valeurs.

EDIT: En d'autres termes, avez-vous une implémentation personnalisée de Equals et/ou GetHashCode?

+0

@sinelaw .... nous n'avons pas d'opérateur d'égalité personnalisé. Hmmmmm – MikeTWebb

+0

MikeTWebb: Ne pas avoir un opérateur d'égalité personnalisé signifie probablement que la comparaison est par référence. Comment savez-vous que vous avez des doublons? BTW, où obtenez-vous l'énumération 'thereturn' de? Un autre problème peut être qu'il contient des doublons en premier lieu. – sinelaw

+0

@sinelaw .... thereturn est une liste de toutes les propositions et elles ont toutes un Guid pour la clé primaire. J'ai ajouté le code ci-dessus. thereturn n'aura pas de doublons. – MikeTWebb