2016-10-07 3 views
2

Я в настоящее время застреваю, пытаясь выяснить, как сортировать, используя поле Event_Number в моей таблице EventNumbers.Linq: Сортировка дочерней коллекции 2 уровня вниз

var entries = await _context.Entries 
      .Include(e => e.EntryEvents) 
       .ThenInclude(ee => ee.EventNumbers) 
        .ThenInclude(en => en.Event) 
      .Include(e => e.EntrySwimmers) 
       .ThenInclude(es => es.Swimmers) 
      .Include(e => e.EventType) 
      .Where(e => e.MeetId == meetId && e.LocationId == locationId) 
      .OrderBy(p => p.EntryEvents 
       .Select(q => q.EventNumbers) 
       .OrderBy(c => c.Event_Number) 
       .Select(c => c.Event_Number) 
       .FirstOrDefault()) 
      .ToListAsync(); 

Я прочитал несколько других сообщений по этой теме и чувствую, что я их следую, но сортировка не работает. Я надеюсь, кто-то может указать на мою ошибку. Кстати, я ОЧЕНЬ новичок в Linq/Asp.net. Если этот запрос составлен плохо, пожалуйста, дайте мне знать. Я просто знаю, что у меня сейчас (кроме заказов) работает ...

Редактировать # 2: Итак, я понял теперь, в результате моих взаимодействий с @ Гертом-Арнольдом, что я думаю, что я ДЕЙСТВИТЕЛЬНО необходимо сортировать мои элементы EntryEvents по полю EventNumbers.Event_Number, а не сортировать EventNumbers по номеру Event_Number.

Модель EntryEvents использует поле EventNumbers.Id в качестве ссылки на эту таблицу и когда я показать записи на мой взгляд, я использую:

@foreach (var e in item.EntryEvents) 
{ 
    <span>Event Number: @Html.DisplayFor(eventitem => e.EventNumbers.Event_Number)</span> 
    <span> | </span> 
    <span>Event Name: @Html.DisplayFor(eventitem => e.EventNumbers.Event.EventName)</span> 
    <br/> 
} 

Для справки, мой EntryEvent сущность:

public class EntryEvent 
{ 
    public int EntryEventId { get; set; } 
    public int EventNumberId { get; set; } 
    public EventNumber EventNumbers { get; set; } 
    public int EntryId { get; set; } 
    public Entry Entry { get; set; } 
    public int EntryTypeId { get; set; } 
    public EntryType EntryTypes { get; set; } 
} 
+0

Я не совсем уверен, что ваша модель loks нравится и что именно вы хотите сделать, но проблема звучит так, как будто вы хотите использовать Sort from Linq. Вы можете предоставить ему функцию, описывающую, как сравнивать два элемента списка. Посмотрите https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs.110).aspx – auX

+0

Сортировка не работает, к сожалению. Когда я пытаюсь выполнить код в статье MSDN, метод «CompareTo» не работает, потому что поле «Event_Number» IEnumerable со списком. – Wyatt

ответ

2

Если вы правильно поняли, что хотите отсортировать Entries по порядковому порядку Event_Number во всех своих вложенных коллекциях EntryEvents.

Если это так, вам нужно выбрать q.EventNumbers.Event_Number s и заказать их. В основном, это:

_context.Entries 
     .Where(e => e.MeetId == meetId && e.LocationId == locationId) 
     .OrderBy(p => p.EntryEvents 
      .Select(q => q.EventNumbers.Event_Number) 
      .OrderBy(n => n) 
      .FirstOrDefault()) 

Для проверки заказа, вы можете обратиться к запроса Синтаксис:

from e in _context.Entries 
where e.MeetId == meetId && e.LocationId == locationId 
let firstNumber = e.EntryEvents 
        .Select(q => q.EventNumbers.Event_Number) 
        .OrderBy(n => n) 
        .FirstOrDefault() 
orderby firstNumber 
select new { firstNumber, e.Name } // Or some other property to identify Entry 

Если это не заказ вы ожидали, я думаю, вы должны сформулировать порядок по-разному ,

+0

Я считаю, что это то, что я ищу. Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке, которое говорит, что мне нужно явно указать аргументы типа. Я пробовал код типа '.SelectMany (q => q.EventNumbers, (parent, child) => new {p = parent, c = child})' Но не повезло (я пробовал разные версии этого). Мне не нравится обращаться за помощью к этому, но как я могу указать типы в этом сценарии? – Wyatt

+0

Это означает, что компилятор не может вывести параметр типового типа 'SelectMany '. Но на данный момент я не совсем понимаю, почему это невозможно. Можете ли вы выполнить '_context.EntryEvents.SelectMany (q => q.EventNumbers)'? –

+0

Такая же ошибка на этой строке. Модель EntryEvents выглядит так: 'public class EntryEvent { public int EntryEventId {get; задавать; } public int EventNumberId {get; задавать; } public EventNumber EventNumbers {get; задавать; } public int EntryId {get; задавать; } public Entry Entry {get; задавать; } public int EntryTypeId {get; задавать; } public EntryType EntryTypes {get; задавать; } } ' – Wyatt

Смежные вопросы