【问题标题】:How to filter a sublist inside parent and return parent with sublist filtered如何过滤父级内的子列表并返回父级过滤子列表
【发布时间】:2018-10-10 21:07:51
【问题描述】:

我想创建一个 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);

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

感谢您的帮助,

大卫

【问题讨论】:

标签: c# linq entity-framework-core


【解决方案1】:

感谢 Hasnain Bukhari,我找到了我想要的解决方案。 解决方案是从文本表开始,分配过滤器,包含所需的实体 (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);

【讨论】:

    【解决方案2】:

    我想你必须试试酸橙这个。这对你有用。 这将类似于 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)
    

    【讨论】:

      【解决方案3】:

      您编写查询的任何具体原因?要么你可以使用 EF 的Eager Loading 来加载所有子表,要么下面的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);
      

      这里用实际的 dbContext 实体集合属性替换 textstranslationspages

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 1970-01-01
        • 2022-06-29
        • 2020-01-14
        • 2015-03-19
        • 2016-08-07
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多