【问题标题】:Linq retrieve non repeated valuesLinq 检索非重复值
【发布时间】:2013-06-20 01:55:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您想使用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 等),这应该足以让 Distinct 按需要工作,而无需提供可选的 IEqualityComparer 参数。

    【讨论】:

    • 感谢您的回答!并及时回复!
    【解决方案2】:

    如果你有一个帮助类来创建一个比较器(如下所示),你可以这样做:

    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 来解决这些类型的问题 - 它非常棒。

    【讨论】:

    • 非常感谢您的回答!它可以工作,但我无法创建一个列表来添加数据
    • @Mazher - 您是否点击了源链接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2014-10-05
    • 2019-12-22
    • 2017-06-06
    相关资源
    最近更新 更多