【问题标题】:Finding MAX date in LINQ query join在 LINQ 查询连接中查找 MAX 日期
【发布时间】:2011-10-20 12:49:23
【问题描述】:

请原谅我对这个问题缺乏了解,因为这个问题非常基础,但我有一个 可为空 [DateTime] 列,我想使用 LINQ 查询来选择记录通过加入找到具有最大“时间戳”的每个用户。

这是我目前的查询。

return (from t1 in db.BU
                from t2 in db.UserNames
                 .Where(t => (t.User_Username == t1.Username))
                from t3 in db.Logins
                .Where(t => (t.username == t1.Username))
                where myBusinessUnits.Contains(t1.BusinessUnit_ID)
                orderby (t2.Name) descending
                select new GlobalMyTeamDetailModel
                {
                     LastLogin = t3.timestamp,
                     Name = t2.Name

                });

如果有人可以帮助我,我将不胜感激。

这是我试图为每个用户获取的“登录”表的最大值。

编辑:另一个没有给出预期结果的尝试:

        var result =
           (from t1 in db.LoginHistories
            where t1.username == user

            from t2 in db.UserNames
                .Where(t => (t.User_Username == t1.username))

            from t3 in db.UserBusinessUnits
                .Where(t => (t.Username == t1.username))

            where myBusinessUnits.Contains(t3.BusinessUnit_ID)

            group t1 by new { t1.username } into g
            let MaxDate = g.Max(uh => uh.timestamp)

            select new GlobalMyTeamDetailModel
                {
                    LastLogin = MaxDate,
                    Name = g.Key.username
                });

【问题讨论】:

  • 你真的加入了那些表吗?您可以通过与其中的用户名列分组来从登录表中获取最后一次登录。
  • 我尝试了一些不同的方法并将其添加到问题中。它仍然返回所有记录。可以推荐吗?

标签: c# linq asp.net-mvc-3 linq-to-sql


【解决方案1】:

如果您始终至少有一个连接行,请按时间戳对 t3 进行排序并获取第一个(应该是最大值)。

return (from t1 in db.BU
            from t2 in db.UserNames
             .Where(t => (t.User_Username == t1.Username))
            from t3 in db.Logins
            .Where(t => (t.username == t1.Username))
            .OrderBy(u => u.timestamp).First()           // <--------- add this
            where myBusinessUnits.Contains(t1.BusinessUnit_ID)
            orderby (t2.Name) descending
            select new GlobalMyTeamDetailModel
            {
                 LastLogin = t3.timestamp,
                 Name = t2.Name

            });

【讨论】:

  • 感谢您的回复,但这会导致“源类型为 IQueryable 的查询表达式中的后续 from 子句中不允许使用类型为 'Login' 的表达式。类型接口调用失败到 SelectMany()"
【解决方案2】:

在 linq 中使用 group by 和 max,如下所示

 From p In db.Products _
            Group p By p.CategoryID Into g = Group _
            Select New With {g, .MaxPrice = g.Max(Function(p) p.UnitPrice)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2015-01-23
    相关资源
    最近更新 更多