如何过滤父项内的子列表并返回父项,并过滤子列表

时间:2018-04-30 18:23:48

标签: c# linq entity-framework-core

我想创建一个linq to sql查询,它将返回一个包含已过滤的子列表的对象列表。

这听起来很容易,但我不知道如何让它发挥作用

这里是返回我想要的SQL Query:

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);

但它没有用,因为我得到了所有语言的子列表,而不是id#1的语言。

感谢您的帮助,

大卫

3 个答案:

答案 0 :(得分:2)

您正在撰写查询的具体原因是什么?您可以使用EF的df %>% mutate_at( .vars1 = colnames(.)[grep("^t_", colnames(.)], .vars2 = colnames(.)[grep("^p", colnames(.)], .funs = calc.W( .vars1, .vars2 , area) ) 加载所有子表,或者在Linq语句下面可以获取所需的结果

Eager Loading

此处将 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); textstranslations替换为实际的dbContext实体集合属性。

答案 1 :(得分:1)

我认为你必须尝试石灰。这对你有用。 这将类似于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)

答案 2 :(得分:1)

我找到了我想要的解决方案,感谢Hasnain Bukhari。 解决方案是从文本表开始,分配过滤器,包含所需的实体(页面)并将结果放入内存( ToList())。然后选择页面。它会按照我必须的顺序给出我想要的结果。

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

return query.SelectMany(x => x.Translation.Pages);