Mil*_*vic 3 c# linq expression casting
我有一种从数据库获取数据的方法,它是通用的:
public static IQueryable<T> GetData<T>(IQueryable<T> data, some more parameters)
Run Code Online (Sandbox Code Playgroud)
data 是未过滤的数据库实体集合,而 GetData 会对该集合进行过滤、排序、跳过、处理...
当我像平常一样提供 IQueryable 类型的变量(T 是 Document)作为第一个参数时,它当然可以工作:
IQueryable<Document> data = ...
GetData<Document>(data, ....);
Run Code Online (Sandbox Code Playgroud)
现在,我需要动态“计算”第一个参数。为此,我使用 LINQ 表达式,它将计算为 IQueryable,但我不知道编译时是哪个 T。我在想这样的事情:
Expression db = Expression.Constant(new DataModelContainer());
Expression table = Expression.Property(db, tbl); /* tbl = "Documents", this is the whole point */
Type type = table.Type.GetGenericArguments()[0];
Expression call = Expression.Call(typeof(Queryable), "AsQueryable", new Type[] { type }, table);
object o = Expression.Lambda(call, null).Compile().DynamicInvoke();
Run Code Online (Sandbox Code Playgroud)
此时,确实是 IQueryable (IQueryable),因此应该能够作为 GetData 的参数。但是,我只有“对象”引用它,自然不能那样使用它。
所以,我的问题是:当 o 正是这样时,有什么方法可以动态地将 'o' 转换为 'IQueryable' 。我知道强制转换是编译时的事情,但我希望有人有某种解决方法。或者也许我尝试太多了。
您可以利用该dynamic功能。动态非常适合您已经必须进行反思的情况:
dynamic o = Expressin.Lambda(...
Run Code Online (Sandbox Code Playgroud)