Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在System.Linq.Dynamic ExpressionParser中实现SelectMany_C#_Dynamic Linq_Linq - Fatal编程技术网

C# 如何在System.Linq.Dynamic ExpressionParser中实现SelectMany

C# 如何在System.Linq.Dynamic ExpressionParser中实现SelectMany,c#,dynamic-linq,linq,C#,Dynamic Linq,Linq,我正在尝试在动态linq expresion解析器中实现SelectMany语句,以便运行如下查询: Customers.Select("Orders.SelectMany(OrderItems)") 这样它就等同于linq查询: Customers.Select(cust => cust.Orders.SelectMany(ord => ord.OrderItems)) 我已经尝试将SelectMany添加到System.Linq.Dynamic.ExpressionParse

我正在尝试在动态linq expresion解析器中实现SelectMany语句,以便运行如下查询:

Customers.Select("Orders.SelectMany(OrderItems)")
这样它就等同于linq查询:

Customers.Select(cust => cust.Orders.SelectMany(ord => ord.OrderItems))
我已经尝试将SelectMany添加到System.Linq.Dynamic.ExpressionParser的IEnumerableSignatures中,但看起来我还需要做更多的工作

我研究过这个codeplex项目,但没有取得任何进展:具体来说,它不会运行我以前的查询,也不支持select或select many


最后,我希望在动态linq语句中使用所有ienumerable linq语句。

要使SelectMany在动态linq查询中工作,您不仅应该修改IEnumerableSignatures,还应该更改ParseAggregate方法,以便为SelectMany传递特定的typeArgs,方法如下:

    Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos)
    {
        ...
        Type[] typeArgs;
        if (signature.Name == "Min" || signature.Name == "Max")
        {
            typeArgs = new Type[] { elementType, args[0].Type };
        }
        else if(signature.Name == "Select")
        {
            typeArgs = new Type[] { elementType, Expression.Lambda(args[0], innerIt).Body.Type };
        } 
        else if(signature.Name == "SelectMany")
        {
            var type = Expression.Lambda(args[0], innerIt).Body.Type;
            var interfaces = type.GetInterfaces().Union(new[] { type });
            Type resultType = interfaces.Single(a => a.Name == typeof(IEnumerable<>).Name).GetGenericArguments()[0];
            typeArgs = new Type[] { elementType, resultType };
        }
        else
        {
            typeArgs = new Type[] { elementType };
        }
        ...
    }
Expression ParseAggregate(表达式实例,类型elementType,字符串methodName,int errorPos)
{
...
类型[]类型args;
if(signature.Name==“Min”| | signature.Name==“Max”)
{
typeArgs=新类型[]{elementType,args[0].Type};
}
else if(signature.Name==“选择”)
{
typeArgs=新类型[]{elementType,Expression.Lambda(args[0],innerIt).Body.Type};
} 
else if(signature.Name==“SelectMany”)
{
var type=Expression.Lambda(args[0],innerIt).Body.type;
var interfaces=type.GetInterfaces().Union(新[]{type});
Type resultType=interfaces.Single(a=>a.Name==typeof(IEnumerable.Name).GetGenericArguments()[0];
typeArgs=新类型[]{elementType,resultType};
}
其他的
{
typeArgs=新类型[]{elementType};
}
...
}

谢谢,效果很好,我还注意到您还添加了Select。注意,我必须确保SelectMany签名包含对象选择器,即void SelectMany(对象选择器)