需要通用函数来执行 Entity Framework 集合的排序
Generic Func needed to perform sorting of Entity Framework collection
我有一个带列的网格。 When the grid column header is selected I post/ajax to server with header selected to return x rows.
在下面的代码中,RefNo 是整数,而 ProposalSectionNumber 是字符串。
如何制作一个接受字符串但 return 将在 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;
}
}
我想做类似的事情
字符串排序顺序 = "RefNo"
var sortfunc = SortFunc(sortOrder)
if (sort.dir == SortDirection.Asc)
{
qry = qry.OrderBy(sortFunc)
}
else
{
qry = qry.OrderByDesc(sortFunc)
}
我一直在努力创建函数 SortFunc(return基于字符串或整数)
实现此目标的最佳方法是什么?
为 sortFunc
声明类型的问题在于它取决于您排序所依据的字段的类型。如果所有字段都是同一类型,比如说,所有 string
,您可以为 sortFunc
变量使用 Expression<Func<MyEntity,string>>
类型。
当排序字段不共享通用类型时,还有另一种消除代码重复的方法。引入一个将排序顺序作为参数的通用辅助方法,并调用它而不是 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;
}
我有一个带列的网格。 When the grid column header is selected I post/ajax to server with header selected to return x rows.
在下面的代码中,RefNo 是整数,而 ProposalSectionNumber 是字符串。
如何制作一个接受字符串但 return 将在 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;
}
}
我想做类似的事情 字符串排序顺序 = "RefNo" var sortfunc = SortFunc(sortOrder)
if (sort.dir == SortDirection.Asc)
{
qry = qry.OrderBy(sortFunc)
}
else
{
qry = qry.OrderByDesc(sortFunc)
}
我一直在努力创建函数 SortFunc(return基于字符串或整数)
实现此目标的最佳方法是什么?
为 sortFunc
声明类型的问题在于它取决于您排序所依据的字段的类型。如果所有字段都是同一类型,比如说,所有 string
,您可以为 sortFunc
变量使用 Expression<Func<MyEntity,string>>
类型。
当排序字段不共享通用类型时,还有另一种消除代码重复的方法。引入一个将排序顺序作为参数的通用辅助方法,并调用它而不是 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;
}