LINQ以不同的结果集连接

时间:2010-07-30 15:42:45

标签: c# 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)

对此的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

Linq distinct很烦人,你必须在你想要Distinct()的类上实现IEqualityComparer接口,然后你得到你所指的不同选择的方式是:

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

SelectMany()展平结合枚举的结果,这样你就不会得到IEnumerable&lt; IEnumerable&lt; State&gt;&gt;但得到IEnumerable&lt; State&gt;

实现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,你的distinct()将不会为你做任何事。

答案 1 :(得分:4)

试试这个:

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

答案 2 :(得分:1)

像这样:

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

请注意,您需要在Equals课程中正确实施GetHashCode State 。 (除非您使用的是LINQ-to-SQL或实体)

如果您只想要ID,则无需实施Equals / GetHashCode;你可以直接打电话

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