繁体   English   中英

LINQ以不同的结果集连接

[英]LINQ join with distinct resultset

我有一个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)

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

尝试这个:

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

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

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

SelectMany()将结果与可枚举结合起来,这样你就不会得到IEnumerable <IEnumerable <State >>但得到IEnumerable <State>

实现IEqualityComparer时,知道Distinct()确实验证了Equals()的结果是等效的,GetHashCode()的结果是等效的。 我认为在你的情况下你想在State类上实现comparer。

可能看起来像这样:

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()将不会为您执行任何操作。

像这样:

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM