Как упорядочить список<объект> по его текущему порядку, чтобы он был принят 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);
}
}
}
}