полностью ленив, нет счета или копирования:
public static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int len)
{
if (len == 0)
throw new ArgumentNullException();
var enumer = source.GetEnumerator();
while (enumer.MoveNext())
{
yield return Take(enumer.Current, enumer, len);
}
}
private static IEnumerable<T> Take<T>(T head, IEnumerator<T> tail, int len)
{
while (true)
{
yield return head;
if (--len == 0)
break;
if (tail.MoveNext())
head = tail.Current;
else
break;
}
}
}
Кажется, вы не можете сортировать коллекцию детей в своем запросе. Любой из них сортируется после запроса или загружает детей во второй запрос.
Аналогичный вопрос и ответ здесь
Как правило, если вы используете кучу включений, это связано с тем, что вам нужно получить доступ к дочерним свойствам в представлении. Что я делаю, это упорядочить дочернюю коллекцию, когда мне нужно получить к ней доступ в виде.
Например, я мог бы создать некоторые инструкции Include для формы master / detail. Нет смысла упорядочивать это в исходном запросе EF. Вместо этого, почему бы не упорядочить эти дочерние записи на уровне представления, когда вы действительно обращаетесь к ним?
Возможно, у меня есть опрос с несколькими вопросами опроса. Если я хочу представить вопросы в определенном порядке, сделайте это на уровне частичного представления, когда я передаю дочернюю коллекцию модели на частичный вид.
@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x =>
x.QuestionId))
Вы не должны преобразовывать тип IQueryable
в IEnumerable
и вызывать Include
, потому что Include
не поддерживается типом IEnumerable
.
Короче говоря, никогда не вызывайте Include после ToList
]
IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)
Include
до ToList
– Serj Sagan
10 May 2016 в 15:56
Метод расширения Include
является простой оболочкой вокруг DbQuery.Include
. Внутренне это не выполняет выражения, но только анализирует их, т. Е. Принимает их выражения членов и преобразует их в путь как строку. Путь используется как вход для DbQuery.Include
.
Перед тем, как улучшить функциональность Include
, было предложено усилить функциональность. чтобы позволить частично загруженные коллекции, включая предложение Where
. Заказ может быть другим запросом на изменение. Но, как вы видите, из-за внутренней работы Include
весь механизм должен быть перепроектирован для реализации таких усовершенствований. Я не вижу его на текущей дорожной карте , поэтому это может занять некоторое время ...
Это никогда не будет работать. EF include - это попытка понять и перевести все на SQL, но вы многое хотите от этого. Загрузите все сущности без сортировки и .ToList () - ing и напишите метод расширения для IEnumerable, чтобы получить упорядоченный результат.