Вернуть одну строку в EF-сгенерированном классе с его дочерним набором, упорядоченным в LinqToSql (c #) - PullRequest
0 голосов
/ 17 июня 2011

Я хотел бы сделать простую операцию с LinqToSql , но не могу найти правильный путь. У меня есть следующие таблицы, представленные с помощью EF-сгенерированной диаграммы классов:

EF-generated class diagram

Если отношение внешнего ключа установлено на SessionId (таблица первичного ключа WebinarSession ).

Я хочу сделать запрос, который возвращает 1 WebinarSession с соответствующими дочерними элементами на WebinarTopic , ORDERED от TopicStartTime .

Учитывая, что _webinarRecordingsDB является объектом хранилища, я уже пробовал решения, которые показались мне более логичными:

WebinarSession lsession = _webinarRecordingsDB.WebinarTopics
    .OrderBy(m => m.TopicStartTime)
    .Select(m => m.WebinarSession)
    .Single(m => m.SessionId == sessionId);

WebinarSession lsession = _webinarRecordingsDB.WebinarSessions
    .Single(m => m.SessionId == sessionId).WebinarTopics
    .OrderBy(m => m.TopicStartTime)
    .Single(m => m.WebinarSession.SessionId == sessionId);

Те запускают исключение, потому что они находят больше строк в WebinarSession. В качестве последнего (нелогичного) средства я также попробовал:

WebinarSession lsession = _webinarRecordingsDB.WebinarSessions
    .Single(m => m.SessionId == sessionId);

lsession.WebinarTopics.OrderBy(m => m.TopicStartTime);

, который не запускает никаких исключений, но не выполняет сортировку при lsession. Кто-нибудь может мне помочь, пожалуйста? Спасибо

EDIT

Я хочу сохранить результат в WebinarSession объект

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Метод расширения OrderBy не изменяет коллекцию, но возвращает новую (упорядоченную) коллекцию. Вам нужно сохранить результаты в переменной и использовать это:

var session = _webinarRecordingsDB.WebinarSessions
    .Single(m => m.SessionId == sessionId);

var topics = session.WebinarTopics.OrderBy(m => m.TopicStartTime);
2 голосов
/ 17 июня 2011

Второй вариант близок, но вы должны назначить отсортированные WebinarTopics обратно новому IList или чему-либо, например, следующему ...

WebinarSession lsession = _webinarRecordingsDB.WebinarSessions.Single(m => m.SessionId == sessionId);
List<WebinarTopic> ltopics = lsession.WebinarTopics.OrderBy(m => m.TopicStartTime).ToList();

НТН. Dave

...