簡體   English   中英

在mvc5中排序,以列名作為參數分頁

[英]Sorting,Paging in mvc5 with column name as parameter

我必須實現排序。 雖然我想通過不對下面的x.SlNo這樣的模型進行硬編碼來做到這一點。

public ActionResult Index(string sortOrder, string sortDirection, int? itemsPerPage, int? page, string SearchString)
{                                              
    IPagedList<TransferBenefits> entityList = null;                                 
    sortOrder = String.IsNullOrEmpty(sortOrder) ? "SlNo" : sortOrder;       

    var propertyInfo = typeof(TransferBenefits).GetProperty(sortOrder);
    var selectList = db.transferBenefits.OrderBy(x => propertyInfo.GetValue(x, null));
    //selectList = db.transferBenefits.OrderBy(x => x.SlNo); --uncommenting this works.
    entityList = selectList.ToPagedList(pageNumber: page ?? 1, pageSize: itemsPerPage ?? 10);

    return View(entityList) 
}

取消注釋的代碼運行正常時,出現此錯誤。

mscorlib.dll中發生類型'System.NotSupportedException'的異常,但未在用戶代碼中處理

附加信息:LINQ to Entities無法識別方法'System.Object GetValue(System.Object, System.Object[])' ,該方法不能轉換為商店表達式。

您可以使用Expression來構建參數。

public static class IQueryableExtensions
{
    public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string sortName, string sortOrder)
    {
        if (string.IsNullOrEmpty(sortName)) return query;
        var retQuery = query;
        var propGroup = sortName.Split(',');

        for (int k = 0; k < propGroup.Length; k++)
        {
            var typeOfProp = typeof(T);
            var sortField = propGroup[k];
            var currentOrder = GetOrderMethod(sortOrder, k);
            var param = Expression.Parameter(typeof(T), "o");
            var props = sortField.Split('.');
            Expression propertyAccess = param;
            var i = 0;
            do
            {
                var property = ReflectionTypePropertyCache<T>.GetProperty(props[i]);
                if (property == null) throw new Exception("property not found :" + sortName);
                typeOfProp = property.PropertyType;
                propertyAccess = Expression.MakeMemberAccess(propertyAccess, property);
                i++;
            } while (i < props.Length);

            var orderByExp = Expression.Lambda(propertyAccess, param);
            var resultExp = Expression.Call(typeof(Queryable),
                    currentOrder,
                    new[] { typeof(T), typeOfProp },
                    retQuery.Expression,
                    Expression.Quote(orderByExp));
            retQuery = retQuery.Provider.CreateQuery<T>(resultExp);
        }
        return retQuery;
    }

    private static string GetOrderMethod(string sortOrder, int index)
    {
        const string ASC = "OrderBy";
        const string DESC = "OrderByDescending";
        const string THENASC = "ThenBy";
        const string THENDESC = "ThenByDescending";
        string AscVar, DescVar;
        if (index == 0)
        {
            AscVar = ASC;
            DescVar = DESC;
        }
        else
        {
            AscVar = THENASC;
            DescVar = THENDESC;
        }

        if (string.IsNullOrEmpty(sortOrder)) return AscVar;
        var orderArr = sortOrder.Split(',');
        if (index >= orderArr.Length) return AscVar;
        if (orderArr[index].ToLower() == "desc") return DescVar;
        return AscVar;
    }
}

您可以將其用作:

var selectList = db.transferBenefits.OrderBy(sortOrder,"");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM