c# - Creating a lambda expression at runtime -


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