Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过数据库集<;T>;通过对Queryable的反射在运行时创建_C#_Linq_Dynamic_Lambda - Fatal编程技术网

C# 通过数据库集<;T>;通过对Queryable的反射在运行时创建

C# 通过数据库集<;T>;通过对Queryable的反射在运行时创建,c#,linq,dynamic,lambda,C#,Linq,Dynamic,Lambda,我试图执行一个动态linq查询,其中我的DbSet类型是在运行时通过反射创建的,我得到一个错误: “匹配的最佳重载方法” 'System.Linq.Queryable.Where(System.Linq.IQueryable, System.Linq.Expressions.Expression>)' 有一些无效的参数“ 这是我的密码 MyDataContext db = new MyDataContext (); var dbType = db.GetType(); var dbSet = d

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

“匹配的最佳重载方法” 'System.Linq.Queryable.Where(System.Linq.IQueryable, System.Linq.Expressions.Expression>)' 有一些无效的参数“

这是我的密码

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();
MyDataContext db=newmydatacontext();
var dbType=db.GetType();
var dbSet=dbType.GetProperty(“MyType”).GetValue(db,null);
dbSet.GetType().InvokeMember(“本地”,BindingFlags.GetProperty,null,dbSet,null)
//只是为了证明它是平等的
dbSet.Equals(db.MyType)//返回true;
//这里我创建了一个动态表达式树
动态l=表达式.Lambda(delagateType,更大,参数);
//在这里,当我传入dbSet var时它会失败,但当我传入db.MyType时它不会失败
动态q=((IEnumerable)Queryable.Where(dbSet,l)).ToList();

问题在于动态调用包含两个参数,第一个是静态的,第二个是动态的。在这种情况下,编译器将静态类型信息用于第一个参数,这与传递
dbSet
变量时的
object
和传递
db.MyType
时的
dbSet
不同

诀窍是像这样对编译器隐藏静态类型信息

dynamic q = ((IEnumerable<object>)Queryable.Where((dynamic)dbSet, l)).ToList();
dynamic q=((IEnumerable)Queryable.Where((dynamic)dbSet,l)).ToList();