EF Core 条件包含

时间:2021-04-17 10:20:30

标签: linq .net-core entity-framework-core

我有一个公司实体,它与订单实体存在一对多关系。

订单可以是匿名的,在这种情况下,查询订单时不应加载相关公司。

当前格式创建一个 IQueryable,然后向其添加过滤器,如下所示:

IQueryable<Order> queryable = ...
...
if (includeCompany is not null and true)
    {
        queryable = queryable.Include(o => o.Company);
    }

if (includeAddress is not null and true)
...

我能否将包含条件设置为在单个查询中使用订单的 isAnonymous bool,以便仅包含非匿名订单的公司实体?

2 个答案:

答案 0 :(得分:2)

很遗憾,没有。过滤后的 Include 不能应用于引用导航属性,只能应用于集合。

你将不得不求助于一个丑陋的解决方法:

context.Orders.Select(o => new 
{ 
    o, 
    Company = o.Order.IsAnonymous
        ? null
        : o.Company
})
.AsEnumerable()
.Select(x => x.o)

现在非匿名订单将具有 Company 引用,因为 EF 通过关系修复填充它们。

AsEnumerable 导致 EF 构建整个匿名类型。没有它,最后的 Select 是表达式的一部分,EF 得出结论,可以完全忽略这些公司,因为它不会在最终结果中“看到”它们。

答案 1 :(得分:0)

当然,queryable = queryable.Include(o => o.Company).where(o => o.isAnonymous);
queryable是IQueryable,可以添加条件,并且没有访问数据库。