2016-03-26 15 views
2

Iは、次の行がDESC日付順に並べた:Entity Frameworkの - SkipWhile

var result = query.Take(4).ToList(); 

0 Dog  2016-03-08 
9 Cat  2016-03-07 
2 Elephant 2016-03-06 
8 Apple  2016-03-05 

次のクエリがなければならない:順序付けられた要素の数(例えば4)限定

var query = this.DbContext.Items.OrderByDescending(g => g.UpdatedAt); 

0 Dog  2016-03-08 
9 Cat  2016-03-07 
2 Elephant 2016-03-06 
8 Apple  2016-03-05 
3 Banana 2016-03-04 
7 Juice  2016-03-03 
4 Potato 2016-03-02 
5 Cafee  2016-03-01 

最初のクエリが返します返品限定(4)ID 3から始まる注文された要素の数:

var result = query.ToList() 
      .SkipWhile(g => g.Id != startFrom.Value) 
      .Take(limit)); 

3 Banana 2016-03-04 
7 Juice  2016-03-03 
4 Potato 2016-03-02 
5 Cafee  2016-03-01 

問題はformanceは、SkipWhileがEFでサポートされていないため、すべてのデータを最初にフェッチする必要があります。

もちろん、私は、すべての古い行をカットすることができます。

var banana = this.Db.Context.Items.FirstOrDefault(g => g.Id == 3); 
var result = query.Where(g => g.CreatedAt < banana.CreatedAt).Take(limit); 

は、単一の、うまくパフォーマンスEFクエリによってそれを達成することが可能ですか?

+1

'query.ToList()を指定すると、EFはDBに対してクエリを実行します。 '.Skip(4)'だけを試してみてください。あなたは4つの項目でリストをページしようとしていますか? –

+0

スキップする要素の数はわかりません。 – Rakoo

答えて

2

二つの文は、常に1つ、より複雑、声明よりも悪い行いませんが、あなたがこれを行うことができます:

var result = query.Where(g => g.CreatedAt < 
            this.DbContext.Items.FirstOrDefault(g2 => g2.Id == 3) 
           .CreatedAt) 
        .Take(limit); 

実際には、それは私がSQLベースでSkipWhile動作を模倣するために参照のみ可能ですフレンドリーな態度。

あなたが本当にタイトなパフォーマンスにしている場合は、あなたが(または多分最高)、最高の第二の選択肢と比較する必要があります

var createdAt = this.Db.Context.Items 
        .Where(g => g.Id == 3) 
        .Select(g => g.CreatedAt) 
        .FirstOrDefault(); 
var result = query.Where(g => g.CreatedAt < createdAt).Take(limit); 

これが唯一の完全なの代わりに、データベースから1つの日付値を選択し、 Item

+0

有用かもしれません。ありがとう。 – Rakoo