我从数据库中获取数据的方法,它是通用的:动态投对象的类型,如果类型是未知在编译时
public static IQueryable<T> GetData<T>(IQueryable<T> data, some more parameters)
数据DB实体未经过滤的收集和的GetData呢过滤,排序,跳过,采取该集合...
当我提供类型IQueryable(T是,例如,文档)的变量作为第一个参数,我通常这样做,当然,它的作品:
IQueryable<Document> data = ...
GetData<Document>(data, ....);
现在,我需要动态“计算”第一个参数。为此,我使用将评估为IQueryable的LINQ表达式,但我不知道在编译时哪个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();
在这点o确实的IQueryable(IQueryable的),这样应该可以作为一个参数的GetData。但是,我只有'对象'的参考,并且自然不能像这样使用它。
所以,我的问题是:有什么办法可以动态地将'o'转换为'IQueryable',当o就是这样。我知道演员是编译时的事情,但我希望有人有某种解决方法。或者也许我尝试了太多。
您是否尝试过做Ø' dyanamic',如'dynamic o = Expressin.Lambda ...'? – Steven 2013-02-23 20:16:24
我没有,但我刚刚做了。我认为这样做会很好。开启了这么多的可能性。它发生在我身上,但总是想着它做了太多的工作。谢啦! – 2013-02-23 20:27:15
等一下,我会张贴作为答案;-) – Steven 2013-02-23 20:32:00