将在运行时通过反射创建的DbSet <t>传递给Queryable

时间:2016-03-09 14:25:09

标签: c# linq dynamic lambda

我尝试执行动态linq查询,其中我的DbSet类型是在运行时通过反射创建的,我得到了错误:

  

&#34;最佳重载方法匹配   &#39; System.Linq.Queryable.Where(System.Linq.IQueryable,   System.Linq.Expressions.Expression&GT;)&#39;   有一些无效的参数&#34;

这是我的代码

MyDataContext db = new MyDataContext ();
var dbType = db.GetType();
var dbSet = dbType.GetProperty("MyType").GetValue(db,null);
dbSet.GetType().InvokeMember("Local", BindingFlags.GetProperty, null, dbSet , null)
//just to show that it equal
dbSet.Equals(db.MyType); //returns true;
//here i create a dynamic expression tree 
dynamic l = Expression.Lambda(delagateType, greater, param);

//here it fails when i pass in my dbSet var but not when i pass db.MyType
dynamic q =   ((IEnumerable<object>)Queryable.Where(dbSet , l)).ToList();

1 个答案:

答案 0 :(得分:2)

问题是你的动态调用包含两个参数,第一个是静态的,第二个是动态的。在这种情况下,编译器使用第一个参数的静态类型信息,当您传递object变量时dbSetDbSet<MyType>传递时db.MyType不同。dynamic q = ((IEnumerable<object>)Queryable.Where((dynamic)dbSet, l)).ToList();

诀窍是隐藏编译器中的静态类型信息,如

{{1}}