带分页的动态 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();