【问题标题】:MvcContrib Grid SortingMvcContrib 网格排序
【发布时间】:2011-07-22 09:03:41
【问题描述】:

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

【问题讨论】:

    标签: linq mvccontrib


    【解决方案1】:

    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 应用程序中。

    【解决方案2】:

    您收到此编译错误是因为您尝试使用仅在 MvcContrib 中定义而不在 System.Linq 中定义的 OrderBy 扩展方法。

    为了修复它,您只需要使用以下行:

    using MvcContrib.Sorting;
    

    然后您可以像在原始代码中一样使用 OrderBy 方法:

    listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);
    

    虽然 itowlson 答案有效,但他只是重新实现了 MvcContrib 中的 OrderBy 扩展方法已经在做的事情(参见 SortExtensions.cs)。

    【讨论】:

    • 我遇到了完全相同的问题,这为我解决了问题
    • 是的,为什么要重新发明轮子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2012-10-02
    • 2011-05-21
    相关资源
    最近更新 更多