Как упорядочить список<объект> по его текущему порядку, чтобы он был принят PagedList?

Проблема: "Метод" Пропустить "поддерживается только для отсортированного ввода в LINQ to Entities. Метод" OrderBy "должен вызываться перед методом" Пропустить "."

list2 = list1.Where(a).OrderBy(x => x.Something).Union(list1.Where(x).OrderBy(x => x.SomethingDifferent));
return list2.ToPagedList(...);

Я предполагаю, что это происходит, потому что это требует нового 'OrderBy' после 'Союза'. Есть ли способ превратить это в OrderedList при сохранении текущего заказа от Союза?

Есть ли способ добавить еще один OrderBy, который фактически не меняет порядок, например:

list2 = list1.Where(a).OrderBy(x => x.Something).Union(list1.Where(x).OrderBy(x => x.SomethingDifferent)).OrderBy(x => x.NothingThatWillAffectTheOrder);

РЕДАКТИРОВАТЬ

Чтобы сделать это более понятным, я объясню на практическом примере.

Скажем, пользователь выполняет поиск в базе данных фильмов, и вы хотите показать заголовки, содержащие строку поиска, перед произнесением имен актеров, содержащих строку поиска.

list = movies.Where(x => x.Title.Contain...).Union(movies.Where(x => x.Actors.Contain..)

PagedList не примет это, потому что он не заказан, но упорядочение этого списка нанесет ущерб цели Союза. Есть ли "обходной путь" для создания этого упорядоченного списка при сохранении текущего порядка?

2 ответа

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

list1.Where(a).OrderBy(x => x.Something)
    .Union(list1.Where(x).OrderBy(x => x.SomethingDifferent))
    .Select((item,idx) => new { item, idx })
    .OrderBy(x => x.idx);

К сожалению, это означает, что вы не выбираете тот же тип, что и раньше. Но в зависимости от того, что вы на самом деле делаете с этим, возможно, вы можете просто сгладить это с помощью чего-то вроде:

 .Select((item,idx) => new { item.Title, item.SomeOtherProperty, idx })

Который, если все, что потребляет, может быть уткой, может быть жизнеспособным

Я не уверен, почему вы получаете ошибку, которая у вас есть. Однако я смог написать программу на основе предоставленной вами информации, которая работает должным образом. Посмотрите на следующее. Надеюсь, это поможет вам точно определить, что вы делаете по-другому. Обратите внимание, что моя реализация ToString() использует новую функцию в C# 6. Если вы используете старую версию C#, вам придется немного изменить эту строку.

using PagedList;
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Actor
    {
        public string Title { get; set; }
        public List<string> Actors { get; set; }
        public override string ToString()
        {
            return $"{Title} featuring {string.Join(", ", Actors)}";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Actor> movies = new List<Actor>()
            {
                new Actor() { Title = "Star Wars", Actors = new List<string>() {  "Mark Hamill", "Harrison Ford" } },
                new Actor() { Title = "Indiana Jones and The Raiders of the Lost Ark", Actors = new List<string>() {  "Karen Allen", "Harrison Ford" } },
                new Actor() { Title = "Indiana Jones and The Temple of Doom", Actors = new List<string>() {  "Kate Kapshaw", "Harrison Ford" } },
                new Actor() { Title = "Indiana Jones and The Kingdom of the Crystal Skull", Actors = new List<string>() {  "Cate Blanchett", "Harrison Ford" } },
                new Actor() { Title = "Jessica Jones", Actors = new List<string>() {  "Krysten Riter", "David Tennant" } },
                new Actor() { Title = "The Wizard of Oz", Actors = new List<string>() {  "Judy Garland" } },
            };

            var list = movies.Where(x => x.Title.Contains("Jones")).Union(movies.Where(x => x.Actors.Contains("Harrison")));

            var pagedList = list.ToPagedList(1, 2);

            foreach (var movie in pagedList)
            {
                Console.WriteLine(movie);
            }
        }
    }
}
Другие вопросы по тегам