我必须从未真正删除已删除记录的数据库中收集数据,而是对其进行标记(存在“ IsActive”位列,其中已删除项目的值保持为0)。
我正在使用Entity Framework Core,并且想要获取货币列表(欧元,美元,...)。每种货币都与1-n个国家/地区相关,因此这里有3列在起作用:
我想一次打电话就能得到所有的货币及其国家。所以我确实有这样的东西:
_ctx.Currency
.Where(c => c.IsActive)
.Include(c => c.CurrencyCountry)
.ThenInclude(cc => cc.CountryNumericCodeNavigation)
.ToList();
这几乎可行;唯一的问题是,我需要指定仅希望活动的“ CurrencyCountries”。因此,我想在“包含”之后和“ ThenInclude”之前添加“ Where IsActive == true”,但看起来无法完成。
还有另一种方法可以完成我想做的事情吗?
谢谢!
答案 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();