为项目中使用所写,扩展实现根据实体自动生成排序,支持多字段排序。但必须与查询实体大小写匹配。
一,建立排序实体。
/// <summary>
/// 排序条件模型
/// </summary>
public class OrderItemModel
{
public string FieldName { get; set; }
public string SortType { get; set; }
}
二,扩展orderby。
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, List<OrderItemModel> oims)
{
if (source == null) throw new ArgumentNullException("source");
var bNull = oims.TrueForAll(s =>
{
if (s.FieldName.IsEmpty() && s.SortType.IsEmpty())
return false;
else
return true;
});
if (!bNull) return source;
string propertyName = string.Empty, sortDirection = string.Empty;
var sorts = oims.ToArray();
for (int i = 0; i < sorts.Length; i++)
{
var sortExpression = sorts[i];
propertyName = sortExpression.FieldName.Trim();
sortDirection = sortExpression.SortType.Trim();
ParameterExpression parameter = Expression.Parameter(source.ElementType, string.Empty);
MemberExpression property = Expression.Property(parameter, propertyName);
LambdaExpression lambda = Expression.Lambda(property, parameter);
string methodName = string.Empty;
if (i == 0)
{
methodName = (sortDirection.ToUpper() == "ASC") ? "OrderBy" : "OrderByDescending";
}
else
{
methodName = (sortDirection.ToUpper() == "ASC") ? "ThenBy" : "ThenByDescending";
}
Expression methodCallExpression = Expression.Call(typeof(Queryable), methodName,
new Type[] { source.ElementType, property.Type },
source.Expression, Expression.Quote(lambda));
source = source.Provider.CreateQuery<T>(methodCallExpression);
}
return source;
}
三,使用方法。在使用排序表达式的位置传入。
List<OrderItemModel> oims = new List<OrderItemModel> {
new OrderItemModel{ FieldName="id", SortType="desc" },
new OrderItemModel{ FieldName="sort", SortType="asc" },
new OrderItemModel{ FieldName="hideInMenu", SortType="desc" },
};
var result = getAsync(oims);
result里就是按上面三个字段和排序方式的结果。
本文介绍了如何在项目中扩展实现自动生成Entity Framework(EF)排序功能,支持多字段且要求查询实体字段匹配。主要包括三个步骤:创建排序实体、扩展OrderBy方法及使用方法,通过排序表达式获取排序后的结果。

被折叠的 条评论
为什么被折叠?



