Linq检索非重复值

时间:2013-06-20 01:55:58

标签: asp.net linq linq-to-sql

我有两个表Event_Day和Event_Session,就像这样

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检索数据

2 个答案:

答案 0 :(得分: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 equijoins,请阅读文档here

之后,您想使用Distinct方法:

var uniqueDayInfo = dayInfo.Distinct();

请注意,如果您不想使用默认的相等性比较,Distinct也会有一个带有IEqualityComparer的重载。初始LINQ查询(初始化dayInfo变量的查询)以对匿名类型的投影结束。匿名类型的默认相等比较在所有属性上运行默认的相等性比较。详细了解匿名类型和被覆盖的Equals方法here

如果所有选定的属性都很简单(intsDateTimes等),这应该足以让Distinct按需运行,而不提供可选的{{1}参数。

答案 1 :(得分: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解决这些类型的问题 - 它会摇滚。