通用Func需要执行Entity Framework集合的排序

时间:2017-11-21 17:18:08

标签: entity-framework linq func

我有一个带有列的网格。选择网格列标题后,我将/ ajax发布到服务器,并选择标题以返回x行。

在以下代码中,RefNo是整数,而ProposalSectionNumber是字符串。

如何使泛型函数获取字符串但返回要在linq语句中使用的Func?

if (sort.dir == SortDirection.Asc)
{
    switch (sort.field)
    {
        case "RefNo":
            qry = qry.OrderBy(x => x.RefNo);
            break;
        case "ProposalSectionNumber":
            qry = qry.OrderBy(x => x.ProposalSectionNumber);
            break;                     
    }
}
else
{
    switch (sort.field)
    {
        case "RefNo":
            qry = qry.OrderByDescending(x => x.RefNo);
            break;
        case "ProposalSectionNumber":
            qry = qry.OrderByDescending(x => x.ProposalSectionNumber);
            break;

    }
}

我想做点什么 string sortOrder =" RefNo" var sortfunc = SortFunc(sortOrder)

if (sort.dir == SortDirection.Asc)
{
   qry = qry.OrderBy(sortFunc)
}
else
{
   qry = qry.OrderByDesc(sortFunc)
}

我一直在努力创建SortFunc函数(它基于字符串或整数返回)

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

声明sortFunc的类型的问题在于它取决于您排序的字段的类型。如果所有字段都属于同一类型,例如所有string s,则可以对Expression<Func<MyEntity,string>>变量使用sortFunc类型。

当排序字段不共享公共类型时,还有另一种删除代码重复的方法。引入一个通用辅助方法,将排序顺序作为参数,并将其调用而不是OrderBy / OrderByDescending

private static IOrderedQueryable<T> AddOrderBy<T,TKey>(
    IQueryable<T> orig
,   Expression<Func<T,TKey>> selector
,   bool isAscending
) {
    return isAscending ? orig.OrderBy(selector) : orig.OrderByDescending(selector);
}

现在您可以按如下方式重写代码:

var isAscending = (sort.dir == SortDirection.Asc);
switch (sort.field) {
    case "RefNo":
        qry = qry.AddOrderBy(x => x.RefNo, isAscending);
        break;
    case "ProposalSectionNumber":
        qry = qry.AddOrderBy(x => x.ProposalSectionNumber, isAscending);
        break;                     
}