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
传递给distinctReqStates
上执行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。