sql server - Entity Framework - SkipWhile -


i have following rows ordered desc date:

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 

the first query returns limited (for example 4) number of ordered elements:

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 

the next query should return limited (4) number of ordered elements starting 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 

the problem performance, because skipwhile not supported ef, have fetch data first.

of course can cut older rows by:

var banana = this.db.context.items.firstordefault(g => g.id == 3); var result = query.where(g => g.createdat < banana.createdat).take(limit); 

is possible achieve single, performance ef query?

two statements don't perform worse one, more complex, statement, this:

var result = query.where(g => g.createdat <                                    this.dbcontext.items.firstordefault(g2 => g2.id == 3)                                  .createdat)                   .take(limit); 

in fact, it's possibility see mimic skipwhile behavior in sql-friendly manner.

if you're tight on performance, should compare second-best (or maybe best) option:

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

this selects 1 date value database in stead of complete item.


Comments