<分区>
我在我的 ASP.NET MVC 3 站点的很多页面中使用了数据表。他们使用服务器端分页,现在我想实现基于列标题的排序。 Datatables 带有 iSortCol_0
,它是点击列的 int 值。
我不喜欢这种方法,因为查询最终会是这样的:
if(iSortCol_0 == 0)
{
// query
// OderBy(x => x.CarName)
}
然后这将对每一列重复(加上每列的 else 子句以按降序排列)。所以我改变了我的方法,现在将列名传递给服务器。
我想出了以下几点:
Expression<Func<vw_Car, string>> sortExpression1 = null;
Expression<Func<vw_Car, int>> sortExpression2 = null;
switch(columnToSort)
{
case "InvoiceNo": sortExpression1 = x => x.CarNo; break;
case "ClientNumber": sortExpression1 = x => x.ForeName; break;
case "ClientName": sortExpression1 = x => x.SurName; break;
default: sortExpression2 = x => x.Age.Value; break;
}
// start of query
.OrderByDir(sortDirection, sortExpression1 , sortExpression2)
现在 OrderByDir
如下所示:
public static IOrderedQueryable<T> OrderByDir<T>(this IQueryable<T> source, string dir, Expression<Func<T, string>> column1, Expression<Func<T, int>> column2)
{
if (column1 != null)
{
return dir == "asc" ? source.OrderBy(column1) : source.OrderByDescending(column1);
}
if (column2 != null)
{
return dir == "asc" ? source.OrderBy(column2) : source.OrderByDescending(column2);
}
return null;
}
这是因为它对类型为 string
或 int
的列进行排序。我还有另一列要排序的 DateTime
,因此我需要编写另一个 sortExpression3
,然后将其添加到我的 OrderByDir
。
但是我不太喜欢这个实现 - 我曾尝试编写一个通用的排序表达式,它将一个对象作为第二个参数而不是 string
、int
、Datetime
,但是当有此代码时,我得到 无法将类型“System.DateTime”强制转换为类型“System.Object”。 LINQ to Entities 仅支持转换实体数据模型基元类型。
关于可能的更好方法,有人有任何想法吗?