【发布时间】:2018-10-17 09:28:42
【问题描述】:
在 EF6 中我习惯这样做:
var orders = GetAllEntities().Include(x => x.Contact.User);
if (includeProducts)
{
orders = orders.Include(x => x.ProductOrders.Select(y => y.RentStockOrders));
orders = orders.Include(x => x.ProductOrders.Select(y => y.Product));
orders = orders.Include(x => x.ProductOrders.Select(y => y.Currency));
orders = orders.Include(x => x.ProductOrders.Select(y => y.Coupons));
orders = orders.Include(x => x.AdditionalCosts);
orders = orders.Include(x => x.Partner);
orders = orders.Include(x => x.OrderCoupons.Select(y => y.Coupon.Partner));
if (includeStock)
{
orders = orders.Include(x => x.ProductOrders.Select(y => y.RentStockOrders.Select(z => z.Stock)));
}
}
if (includeInvoices)
{
orders = orders.Include(x => x.Invoices.Select(y => y.Attachments));
}
在 EF Core 中无法覆盖 IQueryable,因为它更“类型安全”
第一行返回一个IIncludableQueryable<Order, User>,所以当我执行第二个包含时,它想让它变得不同,例如IIncludableQueryable<Ordr,User,ProductOrder>
我主要有一个GetByIdWithCrudRelations,其中包含一组布尔值,用于选择要包含的内容和不包含的内容。有时它只有两个,但在这种情况下它有 8 个,这意味着如果我需要 if-else 一切,它可能会有很多不同的结果。
有人对此有聪明的解决方案吗?
【问题讨论】:
-
第二个include是
Include还是ThenInclude?看起来您正在执行ThenInclude,它采用之前指定的属性。 -
这似乎是公司做出一次然后后悔支持它的架构决策之一。处理包含多个实体的事物会很丑陋,并且取决于您包含事物的顺序。
-
@johnny5 我同意这可能不是最好的架构设计,但它也不是最糟糕的设计,获取你想要的数据,不要从数据库中提取超过所需的数据,不要写x不同的方法,不要使用懒加载
标签: c# entity-framework-core iqueryable