我有一个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)
对此的任何帮助将不胜感激。
答案 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();