【发布时间】:2012-02-07 18:56:32
【问题描述】:
我们正在尝试将IQueryable<EntityObject> 的实例转换为IQueryable<SpecificEntityObject>,SpecificEntityObject 类型仅在运行时已知。
我们尝试使用下面的代码,因为类型或命名空间“objType”不存在,所以无法编译。
var t = query.ElementType;
Type objType = typeof(IQueryable<>).MakeGenericType(t);
var typed = query.Cast<IEnumerable<objType>>();
var grouped = typed.GroupByMany(groupBy.Select(grp => grp.Expression).ToArray());
有什么想法吗?
【问题讨论】:
-
基本上,你不能方便地这样做 - 你必须使用反射,然后
typed将是object或非泛型@ 987654327@,其他的都不起作用。你可以在这里做一些事情,但几乎所有事情都会像任何东西一样丑陋......这里没有灵丹妙药。附带说明一下,Cast调用将是<t>,而不是<IQueryable<t>>(如果你能原谅那里尴尬的伪语法) -
您到底想做什么:将查询结果转换为您仅在运行时知道的类型,或者扩展查询以将转换操作表达为您仅在运行时知道的特定类型?
-
为什么你想这样做?为什么你说你只在运行时知道类型,然后像在编译时知道的那样使用它?
-
我们正在尝试为我们的应用程序创建一个通用的报告 API。因此,在应用程序开发的所有阶段,我们永远不会知道具体的类型。我们有各种表,但是我们将所有这些都存储在 list
中,所以当我们尝试使用 GroupBy 的东西时,我们的 GroupBy 正在反映 EntityObject 并发现它没有我们需要的属性,因为基本类型是 EntityObject 而不是一个特定的类型 - 我们现在觉得我们的设计可能是错误的......关于如何动态 GroupBy 的任何想法? - 这有意义吗? -
我们以另一种方式对所有这些进行了排序...我们重新组织了查询的排列方式...现在我们(使用 Dynamic Linq)创建了一个新的组键并将其作为解析的字符串传递在 - 谢谢你的帮助!
标签: c# linq entity-framework casting iqueryable