【问题标题】:Passing A DbSet<T> created at runtime via reflection to Queryable通过反射将在运行时创建的 DbSet<T> 传递给 Queryable
【发布时间】:2016-03-09 14:25:09
【问题描述】:

我正在尝试执行动态 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();

【问题讨论】:

    标签: c# linq dynamic lambda


    【解决方案1】:

    问题是您的动态调用包含两个参数,第一个是静态的,第二个是动态的。在这种情况下,编译器对第一个参数使用静态类型信息,这是不同的 - 当您传递 dbSet 变量时为 object,当您传递 db.MyType 时为 DbSet&lt;MyType&gt;

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      相关资源
      最近更新 更多