2010-07-30 56 views
4

我有一个LINQ问题。我对linq不太了解。我有两个类:LINQ加入不同的结果集

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

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

我想编写一个LINQ查询,它将返回所有“Person”类的不同状态列表。 SQL中的一个例子是

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

任何帮助,将不胜感激。

回答

5

LINQ的不同是讨厌,你必须实现的类要鲜明的()中的IEqualityComparer接口,那么你得到你的你指的是将不同的选择方式:

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

的SelectMany()平展结果unioning的可枚举,所以你没有得到的IEnumerable < IEnumerable的<国家> >但得到的IEnumerable <国家>

当实现IEqualityComparer时,知道Distinct()确实来自Equals()的结果是等价的,并且来自GetHashCode()的结果是等价的。我认为在你的情况下,你想要在State类上实现比较器。

可能看起来是这样的:

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; } 
} 

记住,你的不同()会为你做什么,如果你不执行的IEqualityComparer。

+0

感谢回答,因为你已经说过,关键是要创建自己的实现。 – TheWebGuy 2012-02-16 15:12:34

1

像这样:

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

请注意,您需要正确实施EqualsGetHashCodeState类。 (除非你使用LINQ-to-SQL或实体)

如果你只是想要这些ID,你不需要实现Equals/GetHashCode;你可以简单地调用

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

试试这个:

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