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
Post a Comment