首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MvcContrib网格排序

MvcContrib网格排序
EN

Stack Overflow用户
提问于 2011-03-24 18:27:53
回答 2查看 1.8K关注 0票数 2

正在测试MvcContrib的网格进行排序。

我正在使用LightSpeed作为我的ORM

问题:在: listOfRfidTags =.上获取编译错误

无法从用法中推断方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer)的类型参数。尝试显式指定类型参数。

代码语言:javascript
复制
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);
        }

意见:

代码语言:javascript
复制
@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);
})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-05 23:54:26

OrderBy扩展方法使用委托来获取排序键,而不是列和方向。所以这句话:

代码语言:javascript
复制
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);

需要看起来像这样:

代码语言:javascript
复制
listOfRfidTags = listOfRfidTags.OrderBy(r => r.SomeProperty);

(或OrderByDescending取决于sort.Direction)。问题是,SomeProperty不能在编译时确定,因为您希望它来自sort.Column。这意味着,如果您想使用LINQ,那么您可能需要使用动态LINQ或反射来提取您想要对其进行排序的属性。

代码语言:javascript
复制
PropertyInfo property = typeof(RfidTag).GetProperty(sort.Column);
listOfRfidTags = listOfRfidTags.OrderBy(r => property.GetValue(r));

但是,由于您使用LightSpeed作为ORM,所以可以绕过LINQ使用核心API,这确实允许动态列名:

代码语言:javascript
复制
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应用程序中。

票数 3
EN

Stack Overflow用户

发布于 2011-04-13 04:47:11

您正在获取此编译错误,因为您试图使用仅在OrderBy MvcContrib中而不是在System.Linq中定义的扩展方法。

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

代码语言:javascript
复制
using MvcContrib.Sorting;

然后,您可以使用OrderBy方法,如原始代码中所示:

代码语言:javascript
复制
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);

尽管itowlson答案有效,但他只是重新实现了OrderBy扩展方法在MvcContrib中已经完成的工作(参见SortExtensions.cs)。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5423728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档