[英]How to filter entity framework result with multiple columns using a lambda expression
I have the following table: 我有下表:
And the following data: 以下数据:
How can i filter the result, so that i only get the latest row from each omraade_id
(sorted descending by timestamp
)? 如何过滤结果,以便我只从每个
omraade_id
获取最新的行(按timestamp
降序排序)?
Which in this case would be the rows with id: 1010
and 1005
在这种情况下,其中id为
1010
和1005
的行
-- -
From @lazyberezovsky's answer, i have created the following expression: 从@ 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();
It returns two rows with the ID 3 and 4, which are the first two rows in the database, and also the ones with the lowest timestamp. 它返回ID为3和4的两行,它们是数据库中的前两行,也是时间戳最低的行。 Any idea why?
知道为什么吗?
var query = dbConnection.Valgdata
.GroupBy(x => x.omraade_id)
.Select(g => g
.OrderByDescending(x => x.timestamp)
.FirstOrDefault());
I have no experience with EF, so I'm unsure if only SQL-esque linq works here. 我没有EF的经验,所以我不确定是否只有SQL-esque linq在这里工作。 A plain C#-ish:
简单的C#-ish:
var query = dbConnection.Valgdata.GroupBy(u => u.omraade_id)
.Select(x => x.FirstOrDefault(y => x.Max(p => p.timestamp) == y.timestamp));
var query = from v in dbConnection.Valgdata
orderby v.timestamp descending
group v by v.omraade_id into g
select g.First();
This will return only record with max timestamp for each omraade_id. 这将仅返回每个omraade_id的最大时间戳记录。
UPDATE query above works fine to me (at least for MS SQL Linq provider). 上面的UPDATE查询对我来说很好(至少对于MS SQL Linq提供程序)。 Also you don't need to do
FirstOrDefault
- if omraade_id is grouped, then it definitely has at least one row. 你也不需要做
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();
You have put filter on every item. 你已经对每个项目进行了过滤。 It should be applied on complete query result, not on every item.
它应该应用于完整的查询结果,而不是每个项目。
Following is updated query. 以下是更新的查询。
var query = (from data in dbConnection.Valgdata
orderby data.timestamp descending
group data by data.omraade_id into g
select g).FirstOrDefault();
This is my solution so far: 到目前为止这是我的解决方案:
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;
I dont know if it is the most effective, but it works. 我不知道它是否最有效,但它确实有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.