Linq To Entities - OrderBy - PullRequest
       45

Linq To Entities - OrderBy

1 голос
/ 25 февраля 2011

Я слежу за учебником Фила Хаака по использованию JQGrid с ASP.Net MVC.Мое приложение ASP.Net MVC 3, использующее Entity Framework 4.

У меня есть следующий код для сортировки и подкачки моих данных, который возвращается в JQGrid

var query = equipService.GetAllEquipment().AsQueryable()
                .OrderBy("it." + sidx + " " + sord)
                .Skip(pageIndex * pageSize)
                .Take(pageSize);

Однако,этот код создает ошибку в строке .OrderBy ("it." + sidx + "" + sord).Ошибка:

System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Запрос вызывает метод GetAllEquipment () в моем слое обслуживания, который выглядит следующим образом:

public List<Equipment> GetAllEquipment()
    {
        List<Equipment> equipList = new List<Equipment>();
        equipList = equipRepository.GetAllEquipment();

        return equipList;
    }

Этот метод затем вызывает то же имя методав моем репозитории вот так

public List<Equipment> GetAllEquipment()
    {
        var query = (from e in Data.DBEntities.Equipments
                     select e).ToList();

        return query;
    }

Я могу решить проблему, создав экземпляр моего objectcontext в методе контроллера и используя этот код

using (AssetEntities context = new AssetEntities())
        {
            int pageIndex = Convert.ToInt32(page) - 1;
            int pageSize = rows;
            int totalRecords = context.Equipments.Count();
            int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);


            var query = context.Equipments
              .OrderBy("it." + sidx + " " + sord)
              .Skip(pageIndex * pageSize)
              .Take(pageSize);

        }

Однако я недействительно не хочу этого делать, скорее я бы хотел придерживаться шаблона хранилища, который я использую в своем приложении для всего взаимодействия с базой данных.

Есть идеи, как мне это исправить?

Спасибокак всегда все.

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Я рекомендую вам использовать PropertyInfo, GetProperty или FieldInfo, GetField в зависимости от вашей модели данных.В этом случае вы можете реализовать OrderBy операцию без каких-либо расширений.Подробнее см. ответ .

ОБНОВЛЕНО : Я перечитал ваш вопрос еще раз внимательно.Мне кажется, что ваша проблема в методе GetAllEquipment.Возвращает List<Equipment>, а не IQueryable<Equipment>.Таким образом, метод GetAllEquipment получает «SELECT * FROM it.Equipment» и возвращает данные в виде List, которые не более Entity equipService.GetAllEquipment().AsQueryable() у вас будет IQueryable<Equipment> объект, но вы больше не будете использовать LINQ to Entity, поэтому вы должны не использовать"it".префикс перед именами.

1 голос
/ 25 февраля 2011

Ваш репозиторий ужасно неправильный.Он всегда загружает все данные из базы данных в приложение и выполняет подкачку и сортировку в памяти веб-сервера.Это большая разница с вашим последним запросом, который выполняет сортировку и разбиение на страницы в БД и возвращает только данные для одной страницы.Если вы хотите создать запрос в контроллере, хранилище и служба должны возвращать IQueryable, и они не должны вызывать ToList.Вызов ToList выполняет текущий запрос.

...