简体   繁体   English

在Entity Framework中加载具有过滤条件的子对象记录

[英]Load child object records with filter condition in Entity Framework

Designed the Data Access Layer with Entity Framework and the Sample POCO Structure of PackageInstance object is 使用实体框架设计了数据访问层,PackageInstance对象的示例POCO结构为

public class PackageInstance
{
  public virtual long PackageInstanceId {set;get;}
  public virtual boolean IsDeleted {set;get;}
  public virtual List<Session> Sessions {set;get;}
}

public class Session
{
  public virtual long SessionId {set;get;}
  public virtual long PackageInstanceId {set;get;}
  public virtual boolean IsDeleted {set;get;}
  public virtual List<Note> Notes {set;get;}
}

public class Note
{
  public virtual long NoteId {set;get;}
  public virtual long SessionId {set;get;}
  public virtual boolean IsDeleted {set;get;}
  public virtual List<Documents> Document {set;get;}
}

I need to load PackageInstance object along with his child objects in single method call, instead of loading each object separately. 我需要在单个方法调用中加载PackageInstance对象及其子对象,而不是分别加载每个对象。

  var packageInstanceDB = entity.PackageInstances.First(p => p.PurchaseSessionId == purhcaseSessionId);                   
  //There is a DB call happening here to load the Session.
  packageInstanceDB.Sessions.Where(s=>!s.IsActive).ForEach(s => 
  {
       //Again there is a DB call happening here to load the associated session notes.
       s.Notes.Where(sn => !sn.IsDeleted).ToList().ForEach(sd=>
       //Again there is a DB call happening here to load the associated note documents.
       sd.Documents.Where(doc=>!doc.IsDeleted));
  });

Here how to eliminate the multiple DB calls? 在这里如何消除多个数据库调用?

Disclaimer : I'm the owner of the project Entity Framework Plus 免责声明 :我是Entity Framework Plus项目的所有者

EF+ Query IncludeFilter feature allow filtering related entities. EF +查询IncludeFilter功能允许过滤相关实体。 It support EF5 支持EF5

var packageInstanceDB = entity.PackageInstances
    .IncludeFilter(x => x.Sessions)
    .IncludeFilter(x => x.Sessions.Select(y => y.Notes.Where(sn => !sn.IsDeleted)))
    .IncludeFilter(x => x.Sessions.SelectMany(y => y.Notes.Where(sn => !sn.IsDeleted)).Select(z => z.Documents.Where(sn => !sn.IsDeleted)))
    .First(p => p.PackageInstanceId == purhcaseSessionId);

Note: Every path must be included 注意:必须包含每个路径

Wiki: EF+ Query IncludeFilter Wiki: EF +查询IncludeFilter

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM