你好我有一张像这样的表=>
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)不应该来的原因。
我希望有人可以帮助我,并展示一种简单的方法。
答案 0 :(得分:5)
你必须告诉Distinct
它应该区分值的属性。如果未指定任何内容,则将使用默认的相等比较器来区分值。
这里有两个选项:
IEqualityComparer
传递给distinct。IEquatable
上实施ReqStates
。示例:
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();
}