Конкатенация строк с процедурами внутри выражения в 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 уже неделю и до сих пор не знаю, с чего начать.