LINQ以不同的结果集连接

The*_*Guy 4 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;}
Run Code Online (Sandbox Code Playgroud)

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

SELECT DISTINCT s.StateID
FROM Person p
JOIN States s ON (p.StateID = s.StateID)
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*rom 6

尝试这个:

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


Jim*_*ffa 5

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

IEnumerable<Person> people = GetPeople();
people.SelectMany((person) => person.LastName).Distinct();
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

请记住,如果不实现IEqualityComparer,则您的distinct()将不会为您执行任何操作.