我正在玩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);
Run Code Online (Sandbox Code Playgroud)
当"分组"是一个对象(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);
Run Code Online (Sandbox Code Playgroud)
回到我的表达式树项目,IQueryProvider.Execute命令返回一个对象,但是当对象是GroupedEnumerable时,我需要能够将对象强制转换为OrderedEnumerable.我尝试过的所有演员都会出现一个错误:"无法将类型'System.Linq.GroupedEnumerable`3的对象强制转换为.....".有谁能告诉我如何将对象转换为更有用的东西?
您的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;
Run Code Online (Sandbox Code Playgroud)
编辑
在您的上述评论之后,如果您的通话输出是GroupedEnumerable<MyEntityItem,int?,MyEntityItem>,那么您可以将其投射到IEnumerable<IGrouping<int?, MyEntityItem>>.