Linq 如何优化排序代码?
我想优化以下代码行进行排序Linq 如何优化排序代码?,linq,asp.net-mvc-3,pagedlist,Linq,Asp.net Mvc 3,Pagedlist,我想优化以下代码行进行排序 public ViewResult Index(string sortorder, int? pagesize, int? page) { int pageSize = pagesize ?? 10; if (Request.HttpMethod != "GET") { page = 1; pageSize = 10;
public ViewResult Index(string sortorder, int? pagesize, int? page)
{
int pageSize = pagesize ?? 10;
if (Request.HttpMethod != "GET")
{
page = 1;
pageSize = 10;
}
ViewBag.SelectedPageSize = pageSize;
ViewBag.CurrentSort = sortorder;
ViewBag.FirstNameSortParm = String.IsNullOrEmpty(sortorder) ? "FirstName desc" : "";
ViewBag.LastNameSortParm = sortorder == "LastName" ? "LastName desc" : "LastName";
ViewBag.DepNameSortParm = sortorder == "depName" ? "depName desc" : "depName";
var joined = from tm in db.TabMasters select tm;
switch (sortorder)
{
case "FirstName":
joined = joined.OrderBy(m => m.FirstName);
break;
case "FirstName desc":
joined = joined.OrderByDescending(m => m.FirstName);
break;
case "LastName":
joined = joined.OrderBy(m => m.LastName);
break;
case "LastName desc":
joined = joined.OrderByDescending(m => m.LastName);
break;
case "depName":
joined = joined.OrderBy(m => m.depName);
break;
case "depName desc":
joined = joined.OrderByDescending(m => m.depName);
break;
default:
joined = joined.OrderBy(m => m.FirstName);
break;
}
int pageIndex = (page ?? 1) - 1;
int start = (pageIndex * pageSize);
ViewBag.TotalRecord = joined.Count();
ViewBag.StartRecord = start + 1;
ViewBag.EndRecord = ((start + pageSize) >= ViewBag.TotalRecord) ? ViewBag.TotalRecord : (start + pageSize);
return View(joined.ToPagedList(pageIndex, pageSize));
}
因为如果我有更多的10个字段要执行排序,这是一种非常乏味的方式
谢谢,
Imdadhusen我对您的实际目标有点模糊,但对于切换部分,您可以使用如下扩展方法
public static class SortExtensions
{
public static IEnumerable<T> SortByField<T>(this IEnumerable<T> sequence, string sortOrder)
{
var tokens = sortOrder.Trim().Split(' ');
var field = tokens[0];
var direction = tokens.Skip(1).Single().ToLower();
var prop = typeof(T).GetProperty(field);
return direction == "desc"
? sequence.OrderByDescending(m => prop.GetValue(m, null))
: sequence.OrderBy(m => prop.GetValue(m, null));
}
}
根据评论进行编辑:
在没有任何错误处理的情况下,行typeof(T).GetProperty(field)是脆弱的。它依赖于第一个令牌作为T类型的公共属性的名称。如果名称与属性不匹配,它将返回null。包括是否匹配字段名。有一个类似的函数用于获取FieldInfo
GetField(field)将返回具有给定名称的公共字段的fieldinfo对象,否则为null。要获取字段的值,只需省略GetValue调用的最后一个参数。您应该看看Linq.DynamicQuery。 这篇博文中有更多信息 该库允许您编写以下代码:
var query = northwind.Products
.Where("CategoryID = 3 AND UnitPrice > 3")
.OrderBy("SupplierID");
而不是
var query = from p in northwind.Products
where p.CategoryID == 3 && p.UnitPrice > 3
orderby p.SupplierID
select p;
如果要添加排序方向:
var query = northwind.Products.OrderBy("SupplierID Descending");
回答得好,我应该为SortByField方法创建一个类吗?你能帮我写完整的类文件吗?见更新。没有完整的类和如何使用SortByField的示例,但这给出了(5)个生成错误:找不到类型或命名空间名称“T”(是否缺少using指令或程序集引用?@imdadhusen很抱歉,我的手机上没有IDE。它现在可以编译了。(错过了signarture方法的类型参数,我使用的Linq方法拼写错误)感谢您宝贵的回复,我感谢您的努力。但我仍然得到错误:var prop=typeof(T).GetProperty(field);这将始终返回NULL
var query = northwind.Products.OrderBy("SupplierID Descending");