LINQ以不同的结果集连接

我有一个LINQ问题。 我对linq并不满意。 我有两节课:

[Person] string FirstName {get;set;} string LastName {get;set;} IEnumerable 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) 

任何有关这方面的帮助将不胜感激。

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

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

SelectMany()将结果与变量相结合,因此你不会获得IEnumerable >但是获得IEnumerable

实现IEqualityComparer时,知道Distinct()确实validation了Equals()的结果是等效的,GetHashCode()的结果是等效的。 我想在你的情况下你想在State类上实现比较器。

可能看起来像这样:

 public class State : IEqualityComparer { 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()将不会为您执行任何操作。

试试这个:

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

像这样:

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

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

如果您只想要ID,则无需实现Equals / GetHashCode ; 你可以简单地打电话

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