[英]is it possible to pass a IIncludableQueryable object and apply it to a DbSet
[英]Apply OrderBy with DbSet
我正在嘗試使用通用存儲庫實現分頁和排序。 如何在DbSet中按列的默認順序獲取主鍵列?
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);
}
我已經使用這些擴展方法來實現類似的東西:
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(GetKeyField(typeof(T))).Skip(pageNumber * pageSize)Take(pageSize);
}
假設您的實體類中的關鍵字段已使用Key
屬性進行了適當的修飾。
一種方法是讓所有實體從一些允許您檢索其主鍵值的接口繼承:
public interface IIdentifiableEntity
{
public int Id {get; set;}
}
那么實現就像:
public class User : IIdentifiableEntity
{
public int UserId {get; set;}
//other properties...
public int Id { get { return UserId; } set { UserId = value; } }
}
然后就像Id
訂購一樣簡單。 這種模式也可以幫助您在其他領域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.