일반 저장소를 사용하여 페이지 매김 및 정렬을 구현하려고합니다. DbSet에서 기본 키 열을 기본 순서로 가져 오는 방법?DbSet을 사용하여 OrderBy 적용
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);
}
이것은 당신이 문자열로 속성 이름을 전달하고 일반 LINQ있는 OrderBy에 전달하는 식을 구축 할 수 있습니다 (:
DbSet = Context.Set<T>();
public IQueryable<T> GetAll(int pageNumber = 0, int pageSize = 10, string sortColumn = "")
{
return DbSet.OrderBy("how to use primary key column here").Skip(pageNumber * pageSize)Take(pageSize);
}
사이드 노트, 나는'Take '를 Skip하고 싶을 것이라고 확신한다. – Jonesopolis
@Jonesy, Yes Thanks, changed ... –