【问题标题】:Linq Max with Default Value具有默认值的 Linq Max
【发布时间】:2011-12-17 22:03:48
【问题描述】:

我正在尝试获取用户的上次登录日期,如果不存在登录记录,则返回今天的日期。我需要一些帮助才能到达那里。我收到以下错误,甚至没有默认值组件。

不能隐式转换类型 'System.Linq.IQueryable' 到 'System.DateTime?'

DateTime? logdate = from userlog in
                                    (from userlog in db.UserLogEntities
                                     where
                                       userlog.UserID == 1 &&
                                       userlog.Action == "Logon" &&
                                       userlog.ActionTag == "Success"
                                     select new
                                     {
                                         userlog.LogDate,
                                         Dummy = "x"
                                     })
                                group userlog by new { userlog.Dummy } into g
                                select new
                                {
                                    Column1 = (DateTime?)g.Max(p => p.LogDate)
                                };

【问题讨论】:

    标签: linq


    【解决方案1】:

    以下是我想出的。让我知道是否有更好的方法。

    LastLogin = (from ul in db.UserLogEntities
                                     where ul.UserID == u.UserID &&
                                        ul.Action == "Logon" &&
                                        ul.ActionTag == "Success"
                                     select ul.LogDate).DefaultIfEmpty(DateTime.Now).Max()
    

    【讨论】:

    • 另一个选项:...select (DateTime?)ul.LogDate).DefaultIfEmpty().Max()
    【解决方案2】:

    这也是一个可行的解决方案。但你也可以使用。这个解决方案那么你就不需要聚合函数了。

    var user= (
            from ul in db.UserLogEntities
             where ul.UserID == u.UserID &&
                ul.Action == "Logon" &&
                ul.ActionTag == "Success"
            orderby ul.LogDate descending
             select ul.LogDate??DateTime.Now ).FirstOrDefault();
    

    【讨论】:

    • 谢谢。一个关键是如果不存在记录,我需要填充今天的日期。
    【解决方案3】:

    这是因为您选择了日期列表。您应该像这样在查询结束时使用 FirstOrDefault() 或 SingleOrDefault()

    select new
                                    {
                                        Column1 = (DateTime?)g.Max(p => p.LogDate)
                                    }.FirstOrDefault();
    

    或者

    select new
                                        {
                                            Column1 = (DateTime?)g.Max(p => p.LogDate)
                                        }.SingleOrDefault();
    

    【讨论】:

    • 类似错误:“AnonymousType#1”不包含“FirstOrDefault”的定义,并且没有扩展方法“FirstOrDefault”接受“AnonymousType#1”类型的第一个参数...
    • 是的,如上所述,这有一个错误,我并没有真正理解意图。
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    相关资源
    最近更新 更多