Enfity Framework查询数据从一个元素开始,不加载所有子元素

时间:2017-11-23 18:36:24

标签: entity-framework

我有一个基于订阅的应用程序。每个订阅都有许多客户,员工等。

我想查询这样的数据:

var subscription = context.Subscriptions.Include(s => s.Customers).Find(id); 
var myQueryCustomers = subscription.Customers.where(...); 

但我知道,在第1行,Include(s => s.Customers)将从此订阅中检索所有客户。

我想仅在第2行查询客户数据

如何从Subscription对象开始对另一个子属性进行查询而不会使服务器充满所有客户不必要的数据?

1 个答案:

答案 0 :(得分:1)

撰写查询表达式并将其提供给Entity Framework,然后使用.Select()从所需的实体模型中检索实体或数据。例如:

var subscriptionAndFilteredCustomers = context.Susbscriptions.Where(s => s.SubscriptionId == id)
  .Select(s => new {Subscription = s, Customers = s.Customers.Where(...).ToList()})
  .SingleOrDefault();

这将返回包含订阅的对象以及来自该订阅的匹配客户的集合,而不会急切加载订阅上的所有客户。

请注意,在返回的Subscription上访问.Customers集合将触发客户的延迟加载,因此请使用返回的customers集合来过滤数据。出于这个原因,我通常建议执行这些类型的查询的代码处于不返回要消费的实体的级别,而是将要返回的视图模型或DTO(用于API)组合以避免延迟加载触发器。上下文范围。