Сортировка сетки 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);
})

person Dave Mateer    schedule 24.03.2011    source источник


Ответы (2)


Метод расширения 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 });

Это имеет дополнительное преимущество, заключающееся в том, что сортировка будет выполняться в базе данных, а не в веб-приложении.

person itowlson    schedule 05.04.2011
comment
Отлично. Я написал programgood.net/2011/04/08/SortingColumnsInMVC3.aspx на основе stackoverflow.com/questions/5417220 / - person Dave Mateer; 08.04.2011

Вы получаете эту ошибку компиляции, потому что пытаетесь использовать метод расширения OrderBy, который определен только в MvcContrib, а не в System.Linq.

Чтобы исправить это, вам просто нужно использовать следующую строку:

using MvcContrib.Sorting;

Затем вы можете использовать метод OrderBy, как в исходном коде:

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

Хотя ответ itowlson работает, он просто заново реализует то, что уже делает метод расширения OrderBy в MvcContrib (см. SortExtensions.cs).

person Luis Rocha    schedule 13.04.2011
comment
У меня была такая же проблема, и это решило ее для меня. - person MrBliz; 24.04.2011
comment
Да зачем изобретать велосипед. - person Doug Chamberlain; 13.12.2013