我有一个公司实体,它与订单实体存在一对多关系。
订单可以是匿名的,在这种情况下,查询订单时不应加载相关公司。
当前格式创建一个 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,以便仅包含非匿名订单的公司实体?
答案 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,可以添加条件,并且没有访问数据库。