使用Linq-to-Entities中的Expression内部的过程连接字符串

时间:2015-04-05 22:41:35

标签: linq entity-framework expression-trees

让我先问一下,请不要回答"在"之前使用AsEnumerable或ToList,这会将数据存入内存然后再订购。由于我打算使用相同的代码动态应用过滤器,这样做无济于事。

有这个课程:

public class Employee {
    public string Name;
    public IEnumerable<string> Childs;
}

我需要能够通过Childs属性对IQueryable进行排序。 由于我无法直接使用string.Join,因此我尝试使用Expressions动态创建它,并将其与存储过程结合使用,该存储过程将返回由&#34;,#34;分隔的名称。

问题在于我无法在订单表达式中合并过程调用。 我使用的订单表达式取自: Dynamic LINQ OrderBy on IEnumerable<T>

public static IOrderedQueryable<T> ApplyOrder<T>(this IQueryable<T> source, string propertyName, string methodName)
{
    string[] properties = propertyName.Split('.');
    Type type = typeof(T);
    ParameterExpression parameter = Expression.Parameter(type);
    Expression expression = parameter;

    PropertyInfo propertyInfo = null;

    foreach (string property in properties)
    {
        propertyInfo = type.GetProperty(property, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase);

        if (propertyInfo.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
        {
            /*
                The ideia was to call the procedure here and use it's value to order the source query
            */
        }
        else
        {
            expression = Expression.Property(expression, propertyInfo);
            type = propertyInfo.PropertyType;
        }
    }

    Type orderDelegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
    LambdaExpression orderLambda = Expression.Lambda(orderDelegateType, expression, parameter);

    return (IOrderedQueryable<T>)typeof(Queryable).GetMethods().Single(method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2)
        .MakeGenericMethod(typeof(T), type)
        .Invoke(null, new object[] { source, orderLambda });
}

老实说,我现在正在学习表达一周,但仍然不知道从哪里开始。

0 个答案:

没有答案