我有下表:
以下数据:
如何过滤结果,以便我只获取每个omraade_id
的最新行(按timestamp
降序排序)?
在这种情况下,ID为1010
和1005
-
从@ lazyberezovsky的回答中,我创建了以下表达式:
dbConnection = new ElecEntities();
var query = from data in dbConnection.Valgdata
orderby data.timestamp descending
group data by data.omraade_id into g
select g.FirstOrDefault();
return query.ToList();
它返回ID为3和4的两行,它们是数据库中的前两行,也是时间戳最低的行。知道为什么吗?
答案 0 :(得分:2)
var query = dbConnection.Valgdata
.GroupBy(x => x.omraade_id)
.Select(g => g
.OrderByDescending(x => x.timestamp)
.FirstOrDefault());
答案 1 :(得分:1)
我没有EF的经验,所以我不确定是否只有SQL-esque linq在这里工作。简单的C#-ish:
var query = dbConnection.Valgdata.GroupBy(u => u.omraade_id)
.Select(x => x.FirstOrDefault(y => x.Max(p => p.timestamp) == y.timestamp));
答案 2 :(得分:0)
var query = from v in dbConnection.Valgdata
orderby v.timestamp descending
group v by v.omraade_id into g
select g.First();
这将仅返回每个omraade_id的最大时间戳记录。
上面的 UPDATE 查询对我来说很好(至少对于MS SQL Linq提供程序)。此外,您不需要执行FirstOrDefault
- 如果omraade_id已分组,那么它肯定至少有一行。
var query = from v in dbConnection.Valgdata
group v by v.omraade_id into g
select g.OrderByDesc(x => x.timestamp).First();
答案 3 :(得分:0)
您已对每个项目进行过滤。它应该应用于完整的查询结果,而不是每个项目。
以下是更新的查询。
var query = (from data in dbConnection.Valgdata
orderby data.timestamp descending
group data by data.omraade_id into g
select g).FirstOrDefault();
答案 4 :(得分:0)
到目前为止,这是我的解决方案:
var data = dbConnection.Valgdata.Where(x => x.godkendt == false).ToList();
var dataGrouped = data.GroupBy(x => x.omraade_id).ToList();
List<Valgdata> list = new List<Valgdata>();
foreach (var grpdata in dataGrouped)
{
var dataGroup = grpdata.OrderByDescending(x => x.timestamp).ToList();
list.Add(dataGroup.FirstOrDefault());
}
return list;
我不知道它是否最有效,但它确实有效。