c# - LINQ: Sorting on many columns dynamically -
i have query of iqueryable , want apply sorting dynamically, sorting can on many columns (asc or desc). i've written following generic function:
private iqueryable<t> applysorting<t,u>(iqueryable<t> query, expression<func<t, u>> predicate, sortorder order) { if (order == sortorder.ascending) { { return query.orderby<t, u>(predicate); } } else { { return query.orderbydescending<t, u>(predicate); } } }
sortorder simple enum 2 values: ascending , descending
then call function in loop, each column user requested sorting. i've noticed fails because sorts on last column used, ignoring other ones.
then found there's 'thenby' method on iorderedqueryable valid usage is:
var q = db.mytype.orderby(x=>x.col1).thenby(y=>y.col2); //etc.
but how can make generic? tried test if query iorderedqueryable seems true if it's simplest var q = x in db.mytype select x
i have no clue why designed this. what's wrong with:
var q = db.mytype.orderby(x=>x.col1).orderby(y=>y.col2); //etc.
it's intuitive
you need check if query ordered :
private iqueryable<t> applysorting<t,u>(iqueryable<t> query, expression<func<t, u>> predicate, sortorder order) { var ordered = query iorderedqueryable<t>; if (order == sortorder.ascending) { if (ordered != null) return ordered.thenby(predicate); return query.orderby(predicate); } else { if (ordered != null) return ordered.thenbydescending(predicate); return query.orderbydescending(predicate); } }
Comments
Post a Comment