2013-06-20 35 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