Linq Max具有默认值

时间:2011-12-17 03:23:43

标签: linq

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

  

无法隐式转换类型   '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)
                                };

3 个答案:

答案 0 :(得分:8)

以下是我的想法。如果有更好的方法,请告诉我。

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

答案 1 :(得分:1)

这也是一个可行的解决方案。但你也可以使用。这个解决方案因此您不需要聚合函数。

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();

答案 2 :(得分:0)

这是因为您选择了日期列表。您应该在查询结尾使用FirstOrDefault()或SingleOrDefault(),如下所示

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

或者

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