EF核心包含,位置和然后包含

时间:2019-07-31 07:30:57

标签: entity-framework asp.net-core .net-core hyperlink

我必须从未真正删除已删除记录的数据库中收集数据,而是对其进行标记(存在“ IsActive”位列,其中已删除项目的值保持为0)。

我正在使用Entity Framework Core,并且想要获取货币列表(欧元,美元,...)。每种货币都与1-n个国家/地区相关,因此这里有3列在起作用:

  • 货币(编号,名称等)
  • CurrencyCountry(CurrencyId,CountryNumericCode)
  • 国家/地区(数字代码,名称等)

我想一次打电话就能得到所有的货币及其国家。所以我确实有这样的东西:

_ctx.Currency
.Where(c => c.IsActive)
.Include(c => c.CurrencyCountry)
.ThenInclude(cc => cc.CountryNumericCodeNavigation)
.ToList();

这几乎可行;唯一的问题是,我需要指定仅希望活动的“ CurrencyCountries”。因此,我想在“包含”之后和“ ThenInclude”之前添加“ Where IsActive == true”,但看起来无法完成。

还有另一种方法可以完成我想做的事情吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

免责声明:我是项目Entity Framework Plus

的所有者

EF + Query IncludeFilter(免费和开源)可轻松过滤包含的实体。

尚不支持ThenInclude,但您只需包含最后一个过滤器即可具有相同的行为。

示例:

_ctx.Currency
.Where(c => c.IsActive)
.IncludeFilter(c => c.CurrencyCountry.Where(c => c.IsActive))
.IncludeFilter(c => c.CurrencyCountry.Where(c => c.IsActive).Select(cc => cc.CountryNumericCodeNavigation))
.ToList();

答案 1 :(得分:0)

您是否尝试过从联结表而不是Currency开始查询?

ctx.CurrencyCountry
.Include(c => c.Currency)
.Include(c => c.Country)
.Where(c => c.Country.IsActive && c.CurrencyCountry.IsActive)
.ToList();

答案 2 :(得分:0)

  

因此,我想在“包含”之后和“ ThenInclude”之前添加“ Where IsActive == true”,但是看起来无法完成。

关于该主题的讨论仍在进行中: https://github.com/aspnet/EntityFrameworkCore/issues/1833

一种解决方法是,您可以在Select中手动过滤数据,这有点复杂:

_ctx.Currency
    .Where(c => c.IsActive)
    .Include(c => c.CurrencyCountry)
    .ThenInclude(cc => cc.CountryNumericCodeNavigation)
    .Select(c => new Currency
    {
        //populate other fields in Currency model here
        CurrencyCountry = c.CurrencyCountry.Where(item => item.IsActive).ToList()
    })
    .ToList();