LINQ: как отсортировать элементы рекурсивной древовидной структуры? [Дубликат]

полностью ленив, нет счета или копирования:

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;
     }
  }
}
29
задан Serj Sagan 14 March 2013 в 03:10
поделиться

5 ответов

Кажется, вы не можете сортировать коллекцию детей в своем запросе. Любой из них сортируется после запроса или загружает детей во второй запрос.

Аналогичный вопрос и ответ здесь

29
ответ дан Community 22 August 2018 в 01:53
поделиться
  • 1
    Я дал вам кредит, потому что вы первыми ответили, и все три ответа в значительной степени говорят то же самое – Serj Sagan 14 March 2013 в 03:11
  • 2
    Это все еще верно для EF версии 6.0? – Brad8118 13 October 2014 в 18:41

Как правило, если вы используете кучу включений, это связано с тем, что вам нужно получить доступ к дочерним свойствам в представлении. Что я делаю, это упорядочить дочернюю коллекцию, когда мне нужно получить к ней доступ в виде.

Например, я мог бы создать некоторые инструкции Include для формы master / detail. Нет смысла упорядочивать это в исходном запросе EF. Вместо этого, почему бы не упорядочить эти дочерние записи на уровне представления, когда вы действительно обращаетесь к ним?

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

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))
0
ответ дан Charles Owen 22 August 2018 в 01:53
поделиться

Вы не должны преобразовывать тип IQueryable в IEnumerable и вызывать Include, потому что Include не поддерживается типом IEnumerable.

Короче говоря, никогда не вызывайте Include после ToList ]

IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)
-1
ответ дан Dovydas Sopa 22 August 2018 в 01:53
поделиться
  • 1
    Ваша точка верна, но она не имеет никакого отношения к заданному вопросу. Я пытаюсь сделать Include до ToList – Serj Sagan 10 May 2016 в 15:56

Метод расширения Include является простой оболочкой вокруг DbQuery.Include . Внутренне это не выполняет выражения, но только анализирует их, т. Е. Принимает их выражения членов и преобразует их в путь как строку. Путь используется как вход для DbQuery.Include.

Перед тем, как улучшить функциональность Include, было предложено усилить функциональность. чтобы позволить частично загруженные коллекции, включая предложение Where. Заказ может быть другим запросом на изменение. Но, как вы видите, из-за внутренней работы Include весь механизм должен быть перепроектирован для реализации таких усовершенствований. Я не вижу его на текущей дорожной карте , поэтому это может занять некоторое время ...

11
ответ дан Gert Arnold 22 August 2018 в 01:53
поделиться

Это никогда не будет работать. EF include - это попытка понять и перевести все на SQL, но вы многое хотите от этого. Загрузите все сущности без сортировки и .ToList () - ing и напишите метод расширения для IEnumerable, чтобы получить упорядоченный результат.

1
ответ дан Peter Kiss 22 August 2018 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: