c# - Apply OrderBy with DbSet -
i trying implement pagination , sorting generic repository. how take primary key column default order column in dbset ?
dbset = context.set<t>(); public iqueryable<t> getall(int pagenumber = 0, int pagesize = 10, string sortcolumn = "") { homecoming dbset.orderby("how utilize primary key column here").skip(pagenumber * pagesize)take(pagesize); }
i have used these extension methods accomplish similar:
public static string getkeyfield(type type) { var allproperties = type.getproperties(); var keyproperty = allproperties.singleordefault(p => p.isdefined(typeof(keyattribute))); homecoming keyproperty != null ? keyproperty.name : null; } public static iqueryable<t> orderby<t>(this iqueryable<t> source, string orderby) { homecoming source.getorderbyquery(orderby, "orderby"); } public static iqueryable<t> orderbydescending<t>(this iqueryable<t> source, string orderby) { homecoming source.getorderbyquery(orderby, "orderbydescending"); } private static iqueryable<t> getorderbyquery<t>(this iqueryable<t> source, string orderby, string methodname) { var sourcetype = typeof(t); var property = sourcetype.getproperty(orderby); var parameterexpression = expression.parameter(sourcetype, "x"); var getpropertyexpression = expression.makememberaccess(parameterexpression, property); var orderbyexpression = expression.lambda(getpropertyexpression, parameterexpression); var resultexpression = expression.call(typeof(queryable), methodname, new[] { sourcetype, property.propertytype }, source.expression, orderbyexpression); homecoming source.provider.createquery<t>(resultexpression); }
this allows pass property name string , build look passes regular linq orderby() function. in case, usage be:
dbset = context.set<t>(); public iqueryable<t> getall(int pagenumber = 0, int pagesize = 10, string sortcolumn = "") { homecoming dbset.orderby(getkeyfield(typeof(t))).skip(pagenumber * pagesize)take(pagesize); }
this assumes key field in entity class decorated key
attribute.
c# repository-pattern dbset
No comments:
Post a Comment