c# - framework範例 - 實體框架-包含多級屬性




entity framework範例 (4)

MSDN上的更多EFCore示例顯示,您可以使用IncludeThenInclude執行一些相當複雜的事情。

這是一個很好的例子,你可以得到多麼複雜(這是一個聲明!):

viewModel.Instructors = await _context.Instructors

      .Include(i => i.OfficeAssignment)

      .Include(i => i.CourseAssignments)
        .ThenInclude(i => i.Course)
            .ThenInclude(i => i.Enrollments)
                .ThenInclude(i => i.Student)

      .Include(i => i.CourseAssignments)
        .ThenInclude(i => i.Course)
            .ThenInclude(i => i.Department)

      .AsNoTracking()
      .OrderBy(i => i.LastName)
      .ToListAsync();

看看你如何在ThenInclude之後連鎖Include ,以及它將你重置為頂級實體(教師)的級別。

您甚至可以多次重複相同的“第一級”集合(CourseAssignments),然後單獨執行ThenIncludes命令以獲得不同的子實體。

請注意,您的實際查詢必須標記在IncludeThenIncludes鏈的末尾。 以下不起作用:

var query = _context.Instructors.AsQueryable();
query.Include(i => i.OfficeAssignment);

var first10Instructors = query.Take(10).ToArray();

強烈建議您設置日誌記錄,並確保您的查詢不失控,如果你包含一兩個以上的東西。 重要的是要看到它是如何工作的 - 並且您會注意到每個單獨的'include'通常是一個新的查詢,以避免大量連接返回冗餘數據。

如果您不打算實際編輯實體並重新AsNoTracking可以大大加快速度。

Include()方法在對象列表上工作得非常好。 但是如果我需要深入兩層呢? 例如,下面的方法將返回ApplicationServers與這裡顯示的包含的屬性。 但是,ApplicationsWithOverrideGroup是另一個容納其他復雜對象的容器。 我也可以在該屬性上執行Include()嗎? 或者我怎樣才能讓該房產充分加載?

就目前而言,這種方法:

public IEnumerable<ApplicationServer> GetAll()
{
    return this.Database.ApplicationServers
        .Include(x => x.ApplicationsWithOverrideGroup)                
        .Include(x => x.ApplicationWithGroupToForceInstallList)
        .Include(x => x.CustomVariableGroups)                
        .ToList();
}

將僅填充Enabled屬性(如下)而不填充Application或CustomVariableGroup屬性(如下)。 我如何做到這一點?

public class ApplicationWithOverrideVariableGroup : EntityBase
{
    public bool Enabled { get; set; }
    public Application Application { get; set; }
    public CustomVariableGroup CustomVariableGroup { get; set; }
}

使用“ThenInclude”加載多個級別:例如:

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ThenInclude(author => author.Photo)
    .ToList();

對於EF 6

using System.Data.Entity;

query.Include(x => x.Collection.Select(y => y.Property))

更多示例請參閱Remarks

確保using System.Data.Entity;添加using System.Data.Entity; 獲取Include lambda的版本。

如果您使用EF Core,則可以使用新方法ThenInclude

query.Include(x => x.Collection)
     .ThenInclude(x => x.Property);

我也必須使用多個包含,並在第三級我需要多個屬性

(from e in context.JobCategorySet
                      where e.Id == id &&
                            e.AgencyId == agencyId
                      select e)
                      .Include(x => x.JobCategorySkillDetails)
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.DurationType))
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RuleType))
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RateType))
                      .FirstOrDefaultAsync();

這可能有助於某人:)







entity-framework