2010-07-30 7 views
4

J'ai une question LINQ. Je ne suis pas super avec linq. J'ai deux classes:LINQ joindre avec resultset distinct

[Person] 
string FirstName {get;set;} 
string LastName {get;set;} 
IEnumerable<State> LastName {get;set;} 

[State] 
int StateID {get;set;} 
string StateName {get;set;} 

Je voudrais écrire une requête LINQ qui renvoie une liste distincte des états pour toutes les classes de « personne ». Un exemple en sql serait

SELECT DISTINCT s.StateID 
FROM Person p 
JOIN States s ON (p.StateID = s.StateID) 

Toute aide à ce sujet serait grandement appréciée.

Répondre

5

Linq distinct est ennuyeux, vous devez implémenter l'interface IEqualityComparer sur la classe que vous voulez Distinct(), la façon dont vous obtenez votre sélection distincte vous faites référence serait:

IEnumerable<Person> people = GetPeople(); 
people.SelectMany((person) => person.LastName).Distinct(); 

SelectMany() aplanit le résultat unioning les enumerables afin de ne pas IEnumerable IEnumerable < < État > > mais se IEnumerable <Etat>

Lors de l'implémentation de IEqualityComparer, sachez que Distinct() valide les deux résultats de Equals() et que les résultats de GetHashCode() sont équivalents. Je pense que dans votre cas, vous voulez implémenter le comparateur sur la classe d'état.

pourrait ressembler à ceci:

public class State : IEqualityComparer<State> 
{ 
    int StateID {get;set;} 
    string StateName {get;set;} 

    public bool Equals(State x, State y) { return x.StateID == y.StateID && x.StateName == y.StateName; } 
    public int GetHashCode(State obj) { return obj.StateId; } 
} 

Rappelez-vous, votre distinct() ne fera rien pour vous si vous ne mettez pas en œuvre le IEqualityComparer.

+0

Merci pour la réponse, la clé que vous avez déjà déclaré est de créer votre propre implémentation. – TheWebGuy

1

Comme ceci:

people.SelectMany(p => p.States).Distinct(); 

Notez que vous devrez implémenter correctement Equalset GetHashCode dans la classe State. (Sauf si vous utilisez LINQ-to-SQL ou des entités)

Si vous voulez simplement les ID, vous n'avez pas besoin de mettre en œuvre Equals/GetHashCode; vous pouvez simplement appeler

people.SelectMany(p => p.States).Select(s => s.StateId).Distinct(); 
2

Essayez ceci:

var stateList = (from s in context.States 
      join p in context.Persons on s.StateId equals p.StateId 
      select s).Distinct();