[英]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.