[英]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.