Entity framework 执行实体框架集合排序所需的泛型Func
我有一个带柱的网格。选择网格列标题后,我将/ajax发布到服务器,并选择标题返回x行 在下面的代码中,RefNo是整数,而ProposalSectionNumber是字符串 如何使泛型函数接受字符串,但返回要在linq语句中使用的FuncEntity framework 执行实体框架集合排序所需的泛型Func,entity-framework,linq,func,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.R
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;
}
}
我想做一些像
字符串sortOrder=“RefNo”
var sortfunc=sortfunc(sortOrder)
我一直在努力创建函数SortFunc(它基于字符串或整数返回)
实现这一点的最佳方法是什么?为
sortFunc
声明类型的问题在于,它取决于排序所依据的字段的类型。如果所有字段的类型都相同,例如,allstring
s,则可以对sortFunc
变量使用Expression
的类型
当排序字段不共享公共类型时,还有另一种消除代码重复的方法。引入一个将排序顺序作为参数的通用帮助器方法,并调用它而不是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);
}
使用System.Linq.Dynamic nuget包,可以按属性名称作为字符串进行排序。
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;
}