我在前端有一個包含多列和分頁的表格。用戶應該能夠對他想要的列進行排序,如果他移動到下一頁,該頁面也應該按給定列排序。
我使用單個排序鍵和分頁的方法:
public List<Person> GetPersons(int page, int numPerPage)
{
return _context.Person
.OrderByDescending(p => p.FirstName)
.Skip(page*numPerPage)
.Take(numPerPage)
}
這僅限于按 排序FirstName,但我怎樣才能用例如LastName等Address...?
uj5u.com熱心網友回復:
OrderByDescending接受一個帶有 2 個型別引數的函式:Expression<Func<TSource, TKey>>whereTKey表示運算式回傳的鍵的型別。
因此,您可以將運算式傳遞給您的方法并在 OrderBy 中使用:
public List<Person> GetPersons<TKey>(int page, int numPerPage,
Expression<Func<Person, TKey>> orderByDesc)
{
return _context.Person
.OrderByDescending(orderByDesc)
.Skip(page*numPerPage)
.Take(numPerPage);
}
型別引數由TKey運算式推斷。因此,它可以按如下方式使用:
var byName = GetPersons(page, pageSize, p => p.FirstName);
var byDate = GetPersons(page, pageSize, p => p.DateOfBirth);
var byHeight = GetPersons(page, pageSize, p => p.Height);
如果要應用過濾器/搜索,請在方法中添加新運算式并使用Where:
public List<Person> GetPersons<TKey>(int page, int numPerPage,
Expression<Func<Person, bool>> filter,
Expression<Func<Person, TKey>> orderByDesc)
{
return _context.Person
.Where(filter)
.OrderByDescending(orderByDesc)
.Skip(page*numPerPage)
.Take(numPerPage);
}
// filter by FirstName, order by LastName
var filtered = GetPersons(page, pageSize,
p => p.FirstName == "Bob", // filter
p => p.LastName); // orderBy
uj5u.com熱心網友回復:
試試這個擴展方法:
public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, SortField);
var exp = Expression.Lambda(prop, param);
string method = Ascending ? "OrderBy" : "OrderByDescending";
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
您可以將屬性名稱作為字串傳遞,例如FirstName,LastName等Address。因此您可以Persons動態訂購。
public List<Person> GetPersons(int page, int numPerPage, string orderFieldName)
{
return _context.Person
.OrderByField(orderFieldName, false)
.Skip(page*numPerPage)
.Take(numPerPage)
}
請參閱:如何使用運算式樹構建動態查詢
編輯:
另一種可能的解決方案是使用System.Linq.Dynamic參見:https ://stackoverflow.com/a/8660293/5519709
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/446633.html
