2011-12-17 95 views
1

我想獲取用戶的最後登錄日期,如果沒有登錄記錄存在,返回今天的日期。我需要一些幫助到達那裏。我收到以下錯誤,甚至沒有默認值組件。Linq Max與默認值

Cannot implicitly convert type 'System.Linq.IQueryable' to '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) 
           }; 

回答

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() 
+0

另一種選擇:... select(DateTime?)ul.LogDate).DefaultIfEmpty()。Max() – Hans 2013-02-12 00:27:09

0

這是因爲您選擇的日期列表。你應該在你的查詢的末尾使用FirstOrDefault()或的SingleOrDefault()這樣的

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

或者

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

類似的錯誤:「AnonymousType#1」如所提到的不包含關於「FirstOrDefault」和沒有擴展方法「FirstOrDefault」接受類型爲「AnonymousType#1」的第一個參數... – scottrakes 2011-12-17 13:15:21

+0

呀,定義此有一個錯誤,我並沒有真正意識到。 – Hans 2013-02-12 00:37:10

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