Как я могу использовать linqTOsql для эффективного получения вложенных списков? - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть три таблицы, к которым я хотел бы обратиться: потоки, записи и FieldInstances.

Я хочу получить список записей внутри потока. Поток может быть блогом или страницей и т. Д., И запись является фактическим экземпляром потока, то есть: «поток: запись страницы: Добро пожаловать» или «поток: запись в блоге: новости о чем-то».

Дело в том, что каждая запись имеет настраиваемое поле данных, связанное с ней через FieldInstance. IE:

поток: страница запись: Добро пожаловать fieldInstance: добро пожаловать Путь к изображению

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

Я играл с таким кодом:

var stream = genesisRepository.Streams.First(x => x.StreamUrl == streamUrl);
IQueryable<StreamEntry> entry = genesisRepository.StreamEntries.Where(x => x.StreamID == stream.StreamID);
IQueryable<FieldInstance> fieldInstances = genesisRepository.FieldInstances.Where(
            // doesn't work because entry is basically returning a collection of some kind.
            // and i can't figure out how to compare a single ID with a list/collection of IDs
            x => x.fiStreamEntryID == entry.Where(e => e.StreamID == stream.StreamID)
        );

Это, конечно, не работает. Изначально я думал о том, чтобы получить все записи в потоке, а затем все fieldInstances в потоке, а затем я буду отображать данные с использованием лямбда-выражений после того, как у меня будет все ... надеюсь, что количество запросов к SQL будет равно двум или трем. Но я не могу понять, как написать linqTOsql для выполнения всего лишь двух или трех запросов. Я продолжаю думать, что мне нужно выполнять запросы в цикле, чтобы получить fieldInstances для каждой записи.

Существует ли запрос LinqTOsql, который выберет все fieldInstances, где StreamEntryID (fk) находится в списке записей, чей (fk) StreamID совпадает с Stream?

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Извините, я не совсем понимаю, к каким столбцам вы присоединяетесь в третьем утверждении, но:

var stream = genesisRepository.Streams.First(x => x.StreamUrl == streamUrl);
IQueryable<StreamEntry> entries = genesisRepository.StreamEntries.Where(x => x.StreamID == stream.StreamID);
IQueryable<FieldInstance> fieldInstances = from entry in entries
    from instance in genesisRepository.FieldInstances
    where entry.entryId == instance.fiStreamEntryID
    select instance;
0 голосов
/ 07 сентября 2010

Это помогает?Я все еще новичок в EF, но вот как бы мне это удалось ...

var results = genesisRepository.FieldInstances
    .Include("StreamEntry.Stream")
    .Where(fi => fi.StreamEntry.Stream.StreamUrl == streamUrl);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...