1

多くのセクションを含むことができるシートがあります。各セクションには、多くのセクションを含めることもできます。データベースへの往復をできるだけ少なくして、シート、そのセクション、およびすべてのサブセクションをロードしたいと考えています。実際には、これは通常 1 ~ 2 レベルの深さになると思いますが、最大で 16 レベルになる可能性もあります。コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

public class Sheet {
    public long Id { get; set; }
    // more fields
    public virtual IList<Section> Sections { get; set; }
}

public class Section {
    public long Id { get; set; }

    public long SheetId { get; set; }
    [ForeignKey("SheetId")]
    public virtual Sheet Sheet { get; set; }

    public long? ParentId { get; set; }
    [ForeignKey("ParentId")]
    public virtual Section Parent { get; set; }

    public virtual IList<Section> Sections { get; set; }
    // more fields
}

public class MyDbContext : DbContext {
    public DbSet<Sheet> Sheets { get; set; }
    public DbSet<Section> Sections { get; set; }
    public Sheet GetSheetConfiguration(long id) {
        Configuration.LazyLoadingEnabled = false;
        Sheet rtn;
        rtn = Sheets.Find(id);
        (Sections.Where(sect => sect.SheetId == id)).ToList();
        return rtn;
    }
}

これにより、必要なテーブル構造が作成されます: Sheets: Id (pk), ... Sections: Id (pk), SheetId (not null), ParentId (null)

GetSheetConfiguration メソッドは、そのシートに関連するすべてのセクションを読み込み、EF に並べ替えさせます。すべてのセクションが Sheet.Sections にもあることを除いて、正しい関係が得られます。(再帰クエリを避けるために、すべてのセクションに SheetId を設定したかったのです。) シート レベルで ParentId = null のセクションのみを使用するように EF に指示するにはどうすればよいですか? - リスト項目

4

1 に答える 1