正在测试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);
})发布于 2011-04-05 23:54:26
OrderBy扩展方法使用委托来获取排序键,而不是列和方向。所以这句话:
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);需要看起来像这样:
listOfRfidTags = listOfRfidTags.OrderBy(r => r.SomeProperty);(或OrderByDescending取决于sort.Direction)。问题是,SomeProperty不能在编译时确定,因为您希望它来自sort.Column。这意味着,如果您想使用LINQ,那么您可能需要使用动态LINQ或反射来提取您想要对其进行排序的属性。
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应用程序中。
发布于 2011-04-13 04:47:11
您正在获取此编译错误,因为您试图使用仅在OrderBy MvcContrib中而不是在System.Linq中定义的扩展方法。
为了修复它,只需使用以下行:
using MvcContrib.Sorting;然后,您可以使用OrderBy方法,如原始代码中所示:
listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);尽管itowlson答案有效,但他只是重新实现了OrderBy扩展方法在MvcContrib中已经完成的工作(参见SortExtensions.cs)。
https://stackoverflow.com/questions/5423728
复制相似问题