我正在使用IQueryProvider.Execute命令,并传入一个表达式,该表达式是我的表达式树项目的一部分。此命令返回一个对象,该对象可以是OrderedEnumerable或GroupedEnumerable,具体取决于原始表达式。 GroupBy表达式创建GroupedEnumerable对象。下面的代码还创建了一个GroupedEnumerable对象,它将向您展示我遇到的问题的示例。
List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 };
object grouped = numbers.GroupBy(n => n % 2 == 0);
当“分组”是一个对象(GroupedEnumerable)时,我无法将其强制转换为允许我在其上调用“GetEnumerator”的任何其他类型。我也无法将它转换为允许我使用“foreach”命令的任何东西。如果我将代码更改为使用“var”(如下所示),则现在分组的类型为OrderedEnumerable。我可以获取枚举器并在foreach命令中使用它。
List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 };
var grouped = numbers.GroupBy(n => n % 2 == 0);
回到我的表达式树项目,IQueryProvider.Execute命令返回一个对象,但是当对象是GroupedEnumerable时,我需要能够将对象强制转换为OrderedEnumerable。我尝试过的所有演员都会出现一个错误:“无法将类型'System.Linq.GroupedEnumerable`3的对象强制转换为.....”。有谁能告诉我如何将对象转换为更有用的东西?
答案 0 :(得分:6)
GroupBy
来电的结果为IEnumerable<IGrouping<bool, int>>
。如果将鼠标悬停在第二个代码示例中的单词var
上,则可以看到此内容。将它投射到这种类型,它将正常工作。
List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 };
object grouped = numbers.GroupBy(n => n % 2 == 0);
IEnumerable<IGrouping<bool, int>> foo =
(IEnumerable<IGrouping<bool, int>>)grouped;
修改强>
完成上述评论后,如果您的通话输出为GroupedEnumerable<MyEntityItem,int?,MyEntityItem>
,则可以将其投放到IEnumerable<IGrouping<int?, MyEntityItem>>
。
答案 1 :(得分:2)
只需将对象转换为IEnumerable<T>
即可。可枚举的实现对您来说无关紧要。