带分页的动态 Linq to Entities Orderby
Dynamic Linq to Entities Orderby with Pagination
我有一个 SQL table 超过 80 万条记录,需要以 25 个结果的页面显示在 Web 上。我需要能够从 table 搜索这些结果并对其进行排序,但是由于 table 太大,我无法将所有结果拉到 filtering/sorting 之前的 IEnumerable(我正在这样做之前它起作用了,但现在进行初始拉动时速度非常慢)。
我已经弄清楚了搜索,但排序真的让我很困惑。我花了几个小时研究它,但找不到任何在 .Skip().Take().
之前有效的解决方案
我需要能够做这样的事情:
string sortField = "Name"; //just for example
string sortDirection = "descending"; //also for example
List<People> = (from s in db.People
orderby sortField sortDirection
select s).Skip((page - 1) * pageSize).Take(pageSize).ToList();
People 中的 sortable 列可以是日期时间、整数或字符串,所以我尝试做类似
的事情
orderby (
currentSort == "Name" ? s.Name :
currentSort = "SignUpDate" ? s.SignupDate : s.Id
)
没有用,因为程序抱怨混合类型。
有什么可以做的吗?在此先感谢您的帮助或线索!
您可以使用以下自定义扩展方法,它使用 System.Linq.Expressions.Expression
class(类似于 )动态构建 OrderBy(Descending)
调用:
public static partial class QueryableExtensions
{
public static IOrderedQueryable<T> OrderByMember<T>(this IQueryable<T> source, string memberPath, bool descending)
{
var parameter = Expression.Parameter(typeof(T), "item");
var member = memberPath.Split('.')
.Aggregate((Expression)parameter, Expression.PropertyOrField);
var keySelector = Expression.Lambda(member, parameter);
var methodCall = Expression.Call(
typeof(Queryable), descending ? "OrderByDescending" : "OrderBy",
new[] { parameter.Type, member.Type },
source.Expression, Expression.Quote(keySelector));
return (IOrderedQueryable<T>)source.Provider.CreateQuery(methodCall);
}
}
像这样:
var people = db.People
.OrderByMember(sortField, sortDirection == "descending")
.Skip((page - 1) * pageSize).Take(pageSize)
.ToList();
我有一个 SQL table 超过 80 万条记录,需要以 25 个结果的页面显示在 Web 上。我需要能够从 table 搜索这些结果并对其进行排序,但是由于 table 太大,我无法将所有结果拉到 filtering/sorting 之前的 IEnumerable(我正在这样做之前它起作用了,但现在进行初始拉动时速度非常慢)。
我已经弄清楚了搜索,但排序真的让我很困惑。我花了几个小时研究它,但找不到任何在 .Skip().Take().
之前有效的解决方案我需要能够做这样的事情:
string sortField = "Name"; //just for example
string sortDirection = "descending"; //also for example
List<People> = (from s in db.People
orderby sortField sortDirection
select s).Skip((page - 1) * pageSize).Take(pageSize).ToList();
People 中的 sortable 列可以是日期时间、整数或字符串,所以我尝试做类似
的事情orderby (
currentSort == "Name" ? s.Name :
currentSort = "SignUpDate" ? s.SignupDate : s.Id
)
没有用,因为程序抱怨混合类型。
有什么可以做的吗?在此先感谢您的帮助或线索!
您可以使用以下自定义扩展方法,它使用 System.Linq.Expressions.Expression
class(类似于 OrderBy(Descending)
调用:
public static partial class QueryableExtensions
{
public static IOrderedQueryable<T> OrderByMember<T>(this IQueryable<T> source, string memberPath, bool descending)
{
var parameter = Expression.Parameter(typeof(T), "item");
var member = memberPath.Split('.')
.Aggregate((Expression)parameter, Expression.PropertyOrField);
var keySelector = Expression.Lambda(member, parameter);
var methodCall = Expression.Call(
typeof(Queryable), descending ? "OrderByDescending" : "OrderBy",
new[] { parameter.Type, member.Type },
source.Expression, Expression.Quote(keySelector));
return (IOrderedQueryable<T>)source.Provider.CreateQuery(methodCall);
}
}
像这样:
var people = db.People
.OrderByMember(sortField, sortDirection == "descending")
.Skip((page - 1) * pageSize).Take(pageSize)
.ToList();