2013-06-20 32 views
1

我有兩個表Event_Day和Event_Session是這樣LINQ的檢索非重複值

Event_Day

Event_Day_Id(PK) Event_Id  DayNo Day_Date 
    420    120   1  20/6/2013 
    421    120   2  21/6/2013 
    422    120   3  22/6/2013 

Event_Session

Event_Session_Id(PK) Event_Id  Event_Day_Id 
    170    120   420   
    171    120   420   
    172    120   420 
    173    120   421 
    174    120   421 
    175    120   421 

我想從這兩個表中的數據進行比較,以檢索使用Linq

Event_Day_Id DayNo  DayDate 
    420   1   21/6/2013 
    421   2   22/6/2013 

請幫我使用Linq檢索數據

回答

0

你想使用Enumerable.Distinct LINQ方法。閱讀文檔here。你首先要做的兩個表聯接(假設你的數據集eventSessionseventDays):

var dayInfo = from sess in eventSessions 
join day in eventDays 
on sess.Event_Day_Id equals day.Event_Day_Id 
select new { Event_Day_Id = sess.Event_Day_Id, DayNo = day.DayNo, DayDate = sess.Day_Date }; 

如果你不熟悉LINQ等值連接,閱讀文檔here

之後,你要使用的Distinct方法:

var uniqueDayInfo = dayInfo.Distinct(); 

注意Distinct也有一個重載需要在IEqualityComparer,在您不想使用默認的相等比較的情況。最初的LINQ查詢(初始化變量dayInfo)以一個匿名類型的投影結束。匿名類型的默認相等比較對所有屬性運行默認的相等比較。閱讀更多關於匿名類型和重寫的Equals方法here

如果所有的選擇的特性是簡單的(intsDateTimes等),這應該是足夠用於根據需要而不設置可選IEqualityComparer參數的Distinct工作。

+0

感謝您的回答!並及時回覆! – Mazher

0

如果你有一個輔助類來創建一個比較器(如下圖所示),你可以做這樣的:

var unique_session = Sessions.Distinct(
    new GenComp<Event_Session>((a,b) => 
     (a.Event_Id == b.Event_Id) && (a.Event_Day_Id == b.Event_Day_Id), 
     (a) => a.Event_Id.GetHashCode()+a.Event_Day_Id.GetHashCode())); 

var result = unique_session.Join(Days, 
     s => new { Event_Id = s.Event_Id, Event_Day_Id = s.Event_Day_Id }, 
     d => new { Event_Id = d.Event_Id, Event_Day_Id = d.Event_Day_Id }, 
     (s, d) => new { Event_Day_Id = d.Event_Day_Id, 
         DayNo = d.DayNo, 
         DayDate = d.Day_Date }); 

這裏是輔助類

public class GenComp<T> : IEqualityComparer<T> 
{ 
    public Func<T, T, bool> comp { get; private set; } 
    public Func<T, int> hash { get; private set; } 

    public GenComp(Func<T, T, bool> inComp, Func<T,int> inHash) 
    { 
     comp = inComp; 
     hash = inHash; 
    } 

    public GenComp(Func<T, T, bool> inComp) 
    { 
     comp = inComp; 
     hash = null; 
    } 

    public bool Equals(T x, T y) 
    { 
     return comp(x, y); 
    } 

    public int GetHashCode(T obj) 
    { 
     return hash == null ? obj.GetHashCode() : hash(obj); 
    } 
} 

它運行完整的源代碼測試LinqPad下是在這裏:https://gist.github.com/hoganlong/5820080

哪個返回如下:

result

注:我建議在LinqPad.com LinqPad解決這些類型的問題 - 它的岩石。

+0

非常感謝您的回答!它的工作原理,但我不能創建一個列表來添加數據 – Mazher

+0

@Mazher - 你是否按照鏈接來源? – Hogan