【问题标题】:Linq GroupBy with sort, take first, and return a listLinq GroupBy 带排序,先取,然后返回一个列表
【发布时间】:2018-12-20 15:24:04
【问题描述】:

我遇到了 Linq-to-SQL 查询。我有一个项目表,每个用户有多个项目。我想获取每个用户的所有最新项目的列表。这就是我所拥有的:

var TheList = (from t in MyDataContext.TheTable
               where t.SomeDate > DateTime.UtcNow.AddMonths(-3)

               group t by t.UserID into TheUserGroups
               from g in TheGroups
               orderby g.SomeDate descending

               select new SomeObject()
               {
                     TheUserID = g.UserID,
                     .....
                }).ToList();  

问题在于它返回的是每个用户的所有项目,而不是每个用户的最新元素。我需要进行哪些更改才能获得预期的结果?

【问题讨论】:

  • LINQ To SQL?你确定你没有使用实体框架吗? 2018 年你真的在使用 .NET 3.5 吗?

标签: c# linq linq-to-sql


【解决方案1】:

尝试以下:

var TheList = (from t in MyDataContext.TheTable
               where t.SomeDate > DateTime.UtcNow.AddMonths(-3)

               orderby g.SomeDate descending

               select new SomeObject()
               {
                     TheUserID = g.UserID,
                })
                .GroupBy(x => x.TheUserID)
                .Select(x => x.FirstOrDefault())
                .ToList();  

【讨论】:

  • 它不喜欢 .SelectMany() 操作
  • 使用 Select 代替。
【解决方案2】:

如果我理解正确的话:

    public class Order
    {
        public int OrderId { get; set; }

        public int UserId { get; set; }

        public DateTime Date { get; set; }

        public string ItemName { get; set; }
    }

    table.Where(o => o.Date < DateTime.UtcNow.AddMonths(-3))
                    .GroupBy(o => o.UserId)
                    .Select(g => new { UserId = g.Key, LastOrder = g.OrderByDescending(o => o.Date).FirstOrDefault() })
.ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多