linq - Optimizing away OrderBy() when using Any() -
linq - Optimizing away OrderBy() when using Any() -
so have standard linq-to-object setup.
var query = expensivesrc.where(x=> x.hasfoo) .orderby(y => y.bar.count()) .select(z => z.frobbername); // ... if (!condition && !query.any()) return; // seems enumerate , sort entire enumerable // ... foreach (var item in query) // ... this enumerates twice. bad.
var queryfiltered = expensivesrc.where(x=> x.hasfoo); var query = queryfiltered.orderby(y => y.bar.count()) .select(z => z.frobbername); if (!condition && !queryfiltered.any()) return; // ... foreach (var item in query) // ... works, there improve way?
would there non-insane way "enlighten" any() bypass non-required operations? think remember sort of optimisation going edulinq.
there not much info can extracted enumerable, maybe it's improve turn query iqueryable? any extension method walks downwards look tree skipping irrelevant operations, turns of import branch delegate can called obtain optimized iqueryable. standard any method applied explicitly avoid recursion. not sure corner cases, , maybe makes sense cache compiled queries, simple queries yours seems work.
static class queryablehelper { public static bool any<t>(this iqueryable<t> source) { var e = source.expression; while (e methodcallexpression) { var mce = e methodcallexpression; switch (mce.method.name) { case "select": case "orderby": case "thenby": break; default: goto dun; } e = mce.arguments.first(); } dun: var d = expression.lambda<func<iqueryable<t>>>(e).compile(); homecoming queryable.any(d()); } } queries must modified this:
var query = expensivesrc.asqueryable() .where(x=> x.hasfoo) .orderby(y => y.bar.count()) .select(z => z.frobbername); linq optimization linq-to-objects
Comments
Post a Comment