Конкатенация строк с процедурами внутри выражения в Linq-to-Entities

Позвольте мне начать с вопроса, пожалуйста, не отвечайте "используйте AsEnumerable или ToList раньше", это приведет к получению данных в память, а затем к порядку. Поскольку я намерен использовать один и тот же код для динамического применения фильтра, это не поможет.

Имея этот класс:

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

Мне нужно иметь возможность сортировать IQueryable по свойству Childs. Поскольку я не могу использовать string.Join напрямую, я пытался сделать это динамически с помощью выражений и объединить его с хранимой процедурой, которая возвращала бы имена, разделенные символом ",".

Проблема в том, что мне не удалось объединить вызов процедуры внутри выражения заказа. Выражение порядка, которое я использую, было взято из этого: Dynamic LINQ OrderBy в IEnumerable;

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 });
}

Честно говоря, я изучаю Expression уже неделю и до сих пор не знаю, с чего начать.

0 ответов

Другие вопросы по тегам