簡體   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