Как отфильтровать подсписок внутри родителя и вернуть родителя с отфильтрованным подсписком - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу создать запрос linq to sql, который будет возвращать список объектов с отфильтрованным подсписком.

Звучит просто, но я не уверен, как заставить это работать

Вот SQL-запрос, который возвращает то, что я хочу:

select * from Texts t inner join Translations tt on t.TranslationId = tt.Id 
inner join Pages p on tt.Id = p.TranslationId and tt.NeutralText = p.TitleNeutralTextId
where t.LanguageId = 1

Теперь я должен написать это с помощью linq.

То, что я до сих пор делал, это:

var query = this.Queryable() // Page entity
                .AsNoTracking()
                .Include(x => x.TitleTranslation.Texts);

            return (from m in query
                    from l in m.TitleTranslation.Texts
                    where m.TitleTranslation.Texts.Any(l => l.LanguageId == 1)
                    select m);

Но это не сработало, потому что я получил подсписок со всеми языками вместо языка с только идентификатором № 1.

Спасибо за помощь,

David

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Я думаю, вы должны попробовать это. это будет работать для вас. Это будет похоже на SQL-запрос

Один из способов сделать это.

var result = from m in Texts
join Translations on Texts.TranslationId = Translation.Id
Join Pages on Translations.NeutralText = Pages.NeutralText
where Texts.LanguageId = 1
select m

Есть еще один способ сделать это с помощью структуры сущностей

var result =       
this.Queryable().AsNoTracking().Include(x=>x.Translations).Where(x=>x.LanguageId= 1)
0 голосов
/ 01 мая 2018

Я нашел решение, которое хотел, благодаря Хаснайн Бухари. Решением было начать с текстовой таблицы, назначить фильтр, включить нужный объект ( Page ) и поместить результаты в память ( ToList () ). Затем выберите страницы. Это даст желаемый результат в том порядке, в котором я должен.

var query = textService.Queryable()
               .AsNoTracking()
               .Include(x => x.Translation.Pages)
               .Where(x => x.LanguageId == languageId).ToList();

return query.SelectMany(x => x.Translation.Pages);
0 голосов
/ 30 апреля 2018

По какой конкретной причине вы пишете запрос? Либо вы можете использовать Eager Loading EF для загрузки всех дочерних таблиц, либо ниже оператор Linq может получить требуемый результат

    var result = texts.Join(translations, t => t.TranslationId, tt => tt.Id, (t, tt) => new {t, tt})
        .Join(pages, ttt => new { Id = ttt.tt.Id, NeutralTextId = ttt.tt.NeutralText }, p => new { Id = p.TranslationId, NeutralTextId = p.TitleNeutralTextId }, (ttt, p) => new {ttt, p})
        .Where(tttt => tttt.ttt.t.LanguageId == 1);

Здесь замените texts, translations и pages фактическим свойством коллекции сущностей dbContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...