2011-12-17 9 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

のようなクエリの最後にFirstOrDefault()またはSingleOrDefault()を使用する必要があります。より良い方法があれば教えてください。

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

0

あなたは日付のリストを選択したためです。あなたは私が思い付いたものです。この

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

+0

うん、の定義が含まれていません述べたように、このバグがあり、私は本当にその意図を持っていません。 – Hans

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

ありがとうございます。 1つのキーは、レコードが存在しない場合、今日の日付を入力する必要があります。 – scottrakes

関連する問題