1

我有下表:

在此处输入图像描述

以及以下数据:

在此处输入图像描述

我如何过滤结果,以便我只能从每个中获取最新行omraade_id(按降序排序timestamp)?

在这种情况下,将是具有 id: 的行10101005

--

从@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 的两行,它们是数据库中的前两行,也是时间戳最低的行。知道为什么吗?

4

5 回答 5

2
var query = dbConnection.Valgdata
                        .GroupBy(x => x.omraade_id)
                        .Select(g => g
                             .OrderByDescending(x => x.timestamp)
                             .FirstOrDefault());
于 2012-11-12T14:12:32.770 回答
1

我没有使用 EF 的经验,所以我不确定是否只有 SQL 风格的 linq 可以在这里工作。一个普通的 C#-ish:

var query = dbConnection.Valgdata.GroupBy(u => u.omraade_id)
      .Select(x => x.FirstOrDefault(y => x.Max(p => p.timestamp) == y.timestamp));
于 2012-11-12T14:45:20.737 回答
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();
于 2012-11-12T13:46:17.387 回答
0

您已在每个项目上放置了过滤器。它应该应用于完整的查询结果,而不是每个项目。

以下是更新的查询。

 var query = (from data in dbConnection.Valgdata
        orderby data.timestamp descending
        group data by data.omraade_id into g
        select g).FirstOrDefault();
于 2012-11-12T14:05:45.440 回答
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;

我不知道它是否最有效,但它确实有效。

于 2012-11-12T14:36:20.407 回答