我正在测试MvcContrib的网格以进行排序。
使用LightSpeed作为我的ORM
问题:收到编译错误:listOfRfidTags = ...
无法从用法推断出方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer)'的类型参数。尝试明确指定类型参数。
public ActionResult Index(GridSortOptions sort)
{
IEnumerable<RfidTag> listOfRfidTags = uow.RfidTags;
if(sort.Column != null) {
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);
}
ViewData["sort"] = sort;
return View(listOfRfidTags);
}
视图:
@Html.Grid(Model).Columns(column =>{
column.For(a => Html.ActionLink("Edit", "Edit", new { id = a.Id })).Named("Edit");
column.For(a => a.TagCode).Named("TagCode").Sortable(true);
column.For(a => a.Number);
})
答案 0 :(得分:11)
您收到此编译错误是因为您尝试使用 OrderBy 扩展方法,该方法仅在 MvcContrib 中定义,而不在System.Linq中定义。
要修复它,您只需使用以下行:
using MvcContrib.Sorting;
然后您可以像原始代码一样使用 OrderBy 方法:
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);
虽然 itowlson 的答案有效,但他只是重新实现了 MvcContrib 中的 OrderBy 扩展方法(参见SortExtensions.cs)。
答案 1 :(得分:3)
OrderBy扩展方法使用委托来获取排序键,而不是列和方向。所以这一行:
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);
需要看起来像这样:
listOfRfidTags = listOfRfidTags.OrderBy(r => r.SomeProperty);
(或OrderByDescending,具体取决于sort.Direction)。问题是SomeProperty无法在编译时确定,因为您希望它来自sort.Column。这意味着如果您想使用LINQ,那么您可能需要使用Dynamic LINQ或Reflection来提取您想要排序的属性,例如
。PropertyInfo property = typeof(RfidTag).GetProperty(sort.Column);
listOfRfidTags = listOfRfidTags.OrderBy(r => property.GetValue(r));
但是,由于您使用LightSpeed作为ORM,因此可以绕过LINQ并使用核心API, 允许动态列名称:
Order order = Order.By(sort.Column);
if (sort.Direction == SortDirection.Descending))
order = order.Descending();
IList<RfidTag> listOfRfidTags = uow.Find<RfidTag>(new Query { Order = order });
这样做的另一个好处是,排序将在数据库上而不是在Web应用程序中进行。