我有这个 LINQ 查询:
ArrayList arr = new ArrayList();
var data = conn.SCOT_DADOS.OrderByDescending(x => x.DATE)
.GroupBy(r => r.USER)
.ToList();
foreach (var item in data)
{
var itemdata = item.Where(r => r.DATE == item.Max(s => s.DATE));
var name = svc.GetUserName(itemdata.Select(r => r.USER).First().ToString());
var value = itemdata.Select(r => r.VALUE).First();
var date = itemdata.Select(r => r.DATE).First().ToString("dd/MM/yyyy HH:mm:ss");
arr.Add( new{ NAME = name, DATE = date, VALUE = value} );
}
此代码将为我提供每个USER
在DATE
之前的最新结果。
但是 LINQ 查询正在选择用户的所有数据,然后我在 foreach 循环中获取最新的数据。
有没有办法只获取 LINQ 查询中的最后一个数据,这样我就不必每次都获取所有用户数据?
我已经尝试过这个:
var data = conn.SCOT_DADOS.OrderByDescending(x => x.DATE)
.GroupBy(r => r.USER)
.First()
.ToList();
然后将 item
视为对象,而不是对其运行选择。
它为我提供了单个用户的所有数据,这不是我想要的。
可以做什么?
编辑1:
如果我尝试交换 OrderByDescending
和 GroupBy
,我会收到此错误:
Error CS1061 'IGrouping' does not contain a definition for 'DATE' and no extension method 'DATE' accepting a first argument of type 'IGrouping' could be found (are you missing a using directive or an assembly reference?)
编辑2:
这是一些示例数据(列名称不同,因为我为问题翻译了它们):
根据提供的数据,我得到结果:
最佳答案
如果(USER,DATE)对的组合是唯一的(查看示例数据时似乎就是这种情况),则可以将要求缩减为
return each record if there is no other record with the same USER and later DATE
可以转换为以下 LINQ 查询:
var result = conn.SCOT_DADOS
.Where(r => !conn.SCOT_DADOS.Any(r2 => r2.USER == r.USER && r2.Date > r.Date))
// end of Db Query
.AsEnumerable()
.Select(r => new
{
Name = svc.GetUserName(r.User),
Value = r.Value,
Date = r.Date.ToString("dd/MM/yyyy HH:mm:ss")
}).ToList();
关于c# - 按用户订购,然后选择最大日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40019729/