让我先问一下,请不要回答"在"之前使用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 });
}
老实说,我现在正在学习表达一周,但仍然不知道从哪里开始。