2016-10-31 7 views
2

私はdb内にログテーブルを持っており、最近RowNameに基づいて追加されたレコードのみをフェッチしたいと考えています。 dbから行を持って来るレコードが、私は同じことを達成するためのより良い方法があるかもしれないと感じる。私は私が右やっているか、別のより良い方法があるだろう知っている必要がありますどのようなlinqをEntityフレームワークに使用して最も最近に挿入された行を読み込みます

using (var context = new DbEntities()) 
     { 
      // get date 
      var latestDate = context.Logs.Max(o => o.RowCreateDate); 

      if(latestDate!=null) 
      { 
       lastDate = new DateTime(latestDate.Value.Year, latestDate.Value.Month, latestDate.Value.Day,00,00,00); 

       logs = context.Logs.Where(o.RowCreateDate >= lastDate).ToList(); 
      } 
     } 

+0

'lastDate'がすでに' Max(RowCreateDate) 'になっている場合、' o.RowCreateDate> = lastDate'をどのように満たすことができますか? – haim770

+0

@ haim770 - OPは 'lastDate'をその日の最初の1分に変更するように見えます。したがって、ログが最終日に作成されたかどうかだけを比較します。 – smoksnes

+0

@smoksnes、あなたは正しいです – Shax

答えて

0

さらに別のオプション:

context.Logs.Where(c => DbFunctions.TruncateTime(c.RowCreateDate) == DbFunctions.TruncateTime(context.Logs.Max(o => o.RowCreateDate))) 

これは、あなたが望むもののように明示的に読み込む(日付ですべての行を取得するには、最大の日付に等しい)と(あなたが期待している可能性があるとしてではない2)また、1つのクエリになります。

0

LINQ to EntitiesはTakeWhileメソッドをサポートしていないため、このコードを単純化することはできません。

あなたは

using (var context = new DbEntities()) 
{   
    // get date 
    var latestDate = context.Logs.Max(o => o.RowCreateDate); 

    if(latestDate!=null) 
    { 
     lastDate = new DateTime(latestDate.Value.Year, latestDate.Value.Month, latestDate.Value.Day,00,00,00); 
     logs = context.Logs 
      .OrderBy(o => o.RowCreateDate) 
      .AsEnumerable() 
      .TakeWhile(o => o.RowCreateDate >= lastDate); 
    } 
} 

を使用することができますが、それは非常に良いではありませんDBから、すべてのデータを受け取り、私はそれをお勧めしません。

0

私は(我々が想定する場合は、トップ3の最新のレコードを取得したい)これがどうなると思う:

var topDates = context.Logs.OrderByDescending(x=>x.RowCreateDate).Take(3) 
+0

なぜあなたは言っていますか.Take(3) – Shax

+0

@Shaxこれは3つのレコードしか取らず、DBから取ったデータの量を最小限に抑えます。 'RowCreateDate' – Alex

+0

私はすべてのレコードを望んでいない、私は日付で最後に挿入されたレコードが欲しいです。 – Shax

0

まず、私はあなたのコードは大丈夫だと思います。私は2つのクエリで問題が表示されません。しかし、あなたはそれを簡素化したい場合は、TruncateTimeを使用して、次のように:

IGrouping<DateTime?, Logs> log = 
     context.Logs.GroupBy(x => DbFunctions.TruncateTime(x.RowCreateDate)) 
      .OrderByDescending(x => x.Key).FirstOrDefault(); 

それはRowCreateDateのための最後の日中に作成されたログでグループ化された結果を返します。

関連する問題