1

我有两个表 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 检索数据

4

2 回答 2

0

您想使用Enumerable.DistinctLINQ 方法。在此处阅读文档。您首先要对两个表进行连接(假设您的数据集是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 等值连接,请阅读此处的文档。

之后,您要使用以下Distinct方法:

var uniqueDayInfo = dayInfo.Distinct();

请注意,在您不想使用默认相等比较的情况下,它Distinct还有一个接受 的重载。IEqualityComparer初始 LINQ 查询(初始化dayInfo变量的查询)以匿名类型的投影结束。匿名类型的默认相等比较对所有属性运行默认相等比较。在此处阅读有关匿名类型和覆盖Equals方法的更多信息。

如果所有选定的属性都是简单的(ints、等),那么在不提供可选参数 的情况下DateTimes,这应该足以让.DistinctIEqualityComparer

于 2013-06-20T02:03:32.400 回答
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

它返回以下内容:

结果

注意:我建议在 LinqPad.com 上使用 LinqPad 来解决这些类型的问题 - 它非常棒。

于 2013-06-20T03:25:46.817 回答