MvcContrib网格排序

时间:2011-03-24 18:27:53

标签: linq mvccontrib

我正在测试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);
})

2 个答案:

答案 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应用程序中进行。