Tôi đã sử dụng những phương pháp mở rộng để đạt được một cái gì đó tương tự:
public static string GetKeyField(Type type)
{
var allProperties = type.GetProperties();
var keyProperty = allProperties.SingleOrDefault(p => p.IsDefined(typeof(KeyAttribute)));
return keyProperty != null ? keyProperty.Name : null;
}
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderBy)
{
return source.GetOrderByQuery(orderBy, "OrderBy");
}
public static IQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string orderBy)
{
return source.GetOrderByQuery(orderBy, "OrderByDescending");
}
private static IQueryable<T> GetOrderByQuery<T>(this IQueryable<T> source, string orderBy, string methodName)
{
var sourceType = typeof(T);
var property = sourceType.GetProperty(orderBy);
var parameterExpression = Expression.Parameter(sourceType, "x");
var getPropertyExpression = Expression.MakeMemberAccess(parameterExpression, property);
var orderByExpression = Expression.Lambda(getPropertyExpression, parameterExpression);
var resultExpression = Expression.Call(typeof(Queryable), methodName,
new[] { sourceType, property.PropertyType }, source.Expression,
orderByExpression);
return source.Provider.CreateQuery<T>(resultExpression);
}
này cho phép bạn vượt qua các tên thuộc tính như là một chuỗi và xây dựng một biểu thức mà nó đi đến thường xuyên LINQ OrderBy () chức năng. Vì vậy, trong trường hợp của bạn, việc sử dụng sẽ là:
DbSet = Context.Set<T>();
public IQueryable<T> GetAll(int pageNumber = 0, int pageSize = 10, string sortColumn = "")
{
return DbSet.OrderBy(GetKeyField(typeof(T))).Skip(pageNumber * pageSize)Take(pageSize);
}
này giả định lĩnh vực then chốt của bạn trong lớp thực thể của bạn được trang trí đúng cách với các thuộc tính Key
.
Nguồn
2014-10-24 15:24:43
lưu ý phụ, tôi chắc chắn bạn sẽ muốn 'Bỏ qua 'rồi' Take' – Jonesopolis
@Jonesy, Có Cảm ơn, đã thay đổi ... –