i have repository class has getasqueryable method defined follows:
public class repository<tentity> : idisposable, irepository<tentity> tentity : class { internal dbset<tentity> _dbset; public virtual iqueryable<tentity> getasqueryable( expression<func<tentity, bool>> filter = null, func<iqueryable<tentity>, iorderedqueryable<tentity>> orderby = null, string includeproperties = "") { iqueryable<tentity> query = _dbset; if (filter != null) { query = query.where(filter); } foreach (var includeproperty in includeproperties.split (new char[] { ',' }, stringsplitoptions.removeemptyentries)) { query = query.include(includeproperty); } if (orderby != null) { return orderby(query); } else { return query; } } } in calling code typically operations such as:
irepository<tracking> repotracking = new repository<tracking>(context); iqueryable<tracking> tracking = repotracking.getasqueryable(); var results = tracking.where(t => t.status_code_id == 15).tolist(); this works great; want able build lambda sent .where @ runtime. have tried building expression tree follows:
irepository<tracking> repotracking = new repository<tracking>(context); iqueryable<tracking> tracking = repotracking.getasqueryable(); var results = tracking.where(t => t.status_code_id == 15).tolist(); irepository<tracking> repotracking = new repository<tracking>(context); iqueryable<tracking> tracking = repotracking.getasqueryable(); parameterexpression pe = expression.parameter(typeof (int), "status_code_id"); lambdaexpression lambda = expression.lambda(expression.equal(pe, expression.constant(15))); methodcallexpression whereexpression = expression.call( typeof(queryable), "where", new type[] { tracking.elementtype }, tracking.expression, lambda); however, yields following exception:
no generic method 'where' on type 'system.linq.queryable' compatible supplied type arguments , arguments. no type arguments should provided if method non-generic.
why can not find where method on instance of tracking?
if want build t => t.status_code_id == 15 dynamically need don't need call where using expression. create expression<func<tentity, bool>> , pass where:
parameterexpression t = expression.parameter(typeof(tracking), "t"); expression statuscode = expression.property(t, "status_code_id"); expression comparison = expression.equal(statuscode, expression.constant(15)); expression<func<tracking, bool>> lambda = expression.lambda<func<tracking, bool>>(comparison, t); var results = tracking.where(lambda).tolist();
Comments
Post a Comment