如何使用LINQ获取不同的值?

时间:2012-01-05 18:22:52

标签: c# linq distinct

你好我有一张像这样的表=>

    stateID    requestNo    reqStateID       reqStateDate
       1          1             13        03.01.2012 10:57
       2          1              3        03.01.2012 10:58
       3          2              3        03.01.2012 11:14
       4          2              3        03.01.2012 11:15
       5          1              5        03.01.2012 22:28
       6          1              7        05.01.2012 14:54
       7          3              3        05.01.2012 14:55

我需要获取,最后添加(reqStateDate)唯一请求否(requestNo)。 我试过这样的事情,但这不起作用..

    public List<ReqStates> GetRequests(int reqStateID)
    {
        return  (from rs in db.ReqStates
                          where rs.reqStateID== reqStateID
                          orderby rs.reqStateDate descending
                          select rs).Distinct().ToList();            
    }

如果参数(reqStateID)为3,我必须得到2个请求。 requestNo = 2且requestNo = 3。 因为,请求的reqstateID都是3,并且它们的添加日期是最新的。 RequestNo = 1 =&GT;最后添加的状态是13。 这就是它(1)不应该来的原因。

我希望有人可以帮助我,并展示一种简单的方法。

3 个答案:

答案 0 :(得分:5)

你必须告诉Distinct它应该区分值的属性。如果未指定任何内容,则将使用默认的相等比较器来区分值。

这里有两个选项:

  1. IEqualityComparer传递给distinct。
  2. IEquatable上实施ReqStates
  3. 示例:

    class ReqStatesComparer: IEqualityComparer<ReqStates>
    {
      public bool Equals(ReqStates a, ReqStates b)
      {
        return a.requestNo == b.requestNo;
      }
    
      public int GetHashCode(ReqStates rs)
      {
        return rs.GetHashCode();
      }
    }
    
    
        public List<ReqStates> GetRequests(int reqStateID)
        {
            return  (from rs in db.ReqStates
                              where rs.reqStateID== reqStateID
                              orderby rs.reqStateDate descending
                              select rs).Distinct(new ReqStatesComparer()).ToList();            
        }
    

答案 1 :(得分:3)

我不确定你想要的结果究竟是什么,但你在整个对象上做了不同的事情。因此,对象必须在所有字段中都是不同的。

尝试下面选择一个字段而不是整个对象。

然后修改为仅使用您需要的字段。

试试这个

return  (from rs in db.ReqStates
                      where rs.reqStateID== reqStateID
                      orderby rs.reqStateDate descending
                      select rs.requestNo).Distinct().ToList();   

答案 2 :(得分:2)

听起来你想通过requestNo检索最新的请求,并给出最新的reqStateDate ID。如果是这种情况,您可以这样做:

public List<ReqStates> GetRequests(int reqStateID)
{
    return db.ReqStates.Where(rs => rs.reqStateID == reqStateID)
                       .GroupBy(rs => rs.requestNo)
                       .Select(g => g.OrderByDescending(rs => rs.reqStateDate).First()) 
                       .ToList();            
}