ホームページ > バックエンド開発 > C++ > Entity Framework Core に深く入れ子になったエンティティを積極的に読み込むにはどうすればよいですか?

Entity Framework Core に深く入れ子になったエンティティを積極的に読み込むにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-28 03:10:10
オリジナル
671 人が閲覧しました

How to Eager Load Deeply Nested Entities in Entity Framework Core?

Entity Framework Core での深く入れ子になったエンティティの一括読み込み

バックグラウンド

Entity Framework Core (EF Core) での一括読み込みは、事前に実行するための手法です。複数のデータベース クエリを回避するために、主エンティティとともに関連エンティティを取得します。ただし、特定のシナリオでは、深くネストされたエンティティを積極的にロードしようとすると制限が発生する可能性があります。

問題

次のシナリオを考慮してください。

public class Order
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CustomerId { get; set; }
    public Customer Customer { get; set; }
}

public class Customer
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public int AddressId { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string PostCode { get; set; }
    public string City { get; set; }
}
ログイン後にコピー

試行するときInclude(nameof(Customer)).ThenInclude(nameof(Address)) を使用して注文をロードすると、Customer の Address プロパティがエンティティが null です。これは、EF Core がデフォルトですべての入れ子になった関連エンティティの一括読み込みをサポートしていないために発生します。

提案された解決策

残念ながら、現時点では、EF Core のすべての深く入れ子になったエンティティの一括読み込みは公式にサポートされていません。 。ただし、これを実現するために使用できるカスタム拡張メソッドが 2 つあります:

Include Extension:

public static IQueryable<T> Include<T>(this IQueryable<T> source, IEnumerable<string> navigationPropertyPaths)
    where T : class
{
    return navigationPropertyPaths.Aggregate(source, (query, path) => query.Include(path));
}
ログイン後にコピー

GetIncludePaths Extension:

public static IEnumerable<string> GetIncludePaths(this DbContext context, Type clrEntityType, int maxDepth = int.MaxValue)
{
    ...
}
ログイン後にコピー

使用法例

汎用リポジトリでは、GetAllAsync メソッドを次のように変更できます。

public virtual async Task<IEnumerable<T>> GetAllAsync(Expression<Func<T, bool>> predicate = null)
{
    var query = Context.Set<T>()
        .Include(Context.GetIncludePaths(typeof(T));
    if (predicate != null)
        query = query.Where(predicate);
    return await query.ToListAsync();
}
ログイン後にコピー

これらの拡張メソッドを使用すると、指定された型のネストされた関連エンティティをすべて積極的に読み込むことができます。

以上がEntity Framework Core に深く入れ子になったエンティティを積極的に読み込むにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート