如何使用lambda表达式过滤多列的实体框架结果

时间:2012-11-12 13:42:22

标签: c# linq entity-framework-4 lambda

我有下表:

enter image description here

以下数据:

enter image description here

如何过滤结果,以便我只获取每个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的两行,它们是数据库中的前两行,也是时间戳最低的行。知道为什么吗?

5 个答案:

答案 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;

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