C# 如何使用LINQ获得不同的值?

C# 如何使用LINQ获得不同的值?,c#,linq,distinct,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

你好,我有一张这样的桌子=>

    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();            
    }
public List GetRequests(int-reqStateID)
{
返回(来自db.REQ状态中的rs
其中rs.reqStateID==reqStateID
orderby rs.reqStateDate降序
选择rs.Distinct().ToList();
}
如果参数(reqStateID)取3,我必须得到2个请求。requestNo=2和requestNo=3。 因为,请求的reqstateID都是3,它们的添加日期都是最新的。 RequestNo=1=>最后添加的状态为13。 这就是为什么它(1)不应该出现


我希望有人能帮助我,并给出一个简单的方法。

听起来您想通过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();            
}
public List GetRequests(int-reqStateID)
{
返回db.ReqStates.Where(rs=>rs.reqStateID==reqStateID)
.GroupBy(rs=>rs.requestNo)
.Select(g=>g.OrderByDescending(rs=>rs.reqStateDate).First())
.ToList();
}

我不确定你到底在寻找什么结果,但你在整个对象上做了不同的操作。因此,对象必须在所有字段中都是不同的

试着在下面选择一个字段,而不是整个对象

然后修改为仅使用所需的字段

试试这个

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

您必须告诉
Distinct
,它应该通过什么属性区分值。如果未指定任何内容,则将使用默认相等比较器区分这些值

这里有两个选项:

  • IEqualityComparer
    传递给distinct
  • ReqStates
    上执行
    IEquatable
  • 例如:

    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();            
        }
    
    class ReqStates比较者:IEqualityComparer
    {
    公共布尔等于(需求状态a、需求状态b)
    {
    返回a.requestNo==b.requestNo;
    }
    公共int GetHashCode(请求状态)
    {
    返回rs.GetHashCode();
    }
    }
    公共列表GetRequests(int reqStateID)
    {
    返回(来自db.REQ状态中的rs
    其中rs.reqStateID==reqStateID
    orderby rs.reqStateDate降序
    选择rs).Distinct(新ReqStatesComparer()).ToList();
    }
    
    我尝试过,但是我得到了一个错误:“方法‘第一’只能用作最终的查询操作。考虑在这个实例中使用方法‘FrestRealStuty'代替。”用FrStReDebug()替换“FixStand()),但是这次“在编写命令定义时发生了错误。详情请参见内部异常”。出现错误。内部异常表示{“不支持指定的方法”。}@user892945这是LINQ到SQL、EF还是LINQ到对象?(以上在Linq to Objects中运行良好…)您能给我一个使用IEqualityComparer的示例吗?很好理解的示例,我很感激我已经尝试过了,但这给了我所有reqStateID==3的requestNo。第一个条件是请求添加日期(reqStateDate)必须是最新的,然后reqStateID==3。