ホームページ >バックエンド開発 >C++ >Entity Framework Core 2.0.1 で入れ子になったエンティティを効率的にロードするにはどうすればよいですか?

Entity Framework Core 2.0.1 で入れ子になったエンティティを効率的にロードするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-26 05:13:10280ブラウズ

How Can I Efficiently Eager Load Nested Entities in Entity Framework Core 2.0.1?

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

Entity Framework Core 2.0.1 では、入れ子になったエンティティの一括読み込みは次のようになります。組み込み機能ではありません。これは、複数レベルの関係を持つエンティティを読み込むときに問題になり、相互にネストされた関連エンティティの値が null になります。

この課題に対処するには、カスタム拡張メソッドを利用できます。

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));
}

このメソッドにより、文字列として指定された複数のナビゲーション プロパティの一括読み込みが可能になります。

別のカスタム拡張メソッドを使用して、以下に基づいて含めるパスを生成できます。エンティティ タイプのメタデータ:

public static IEnumerable<string> GetIncludePaths(this DbContext context, Type clrEntityType, int maxDepth = int.MaxValue)
{
    // Implementation omitted for brevity
}

このメソッドは、エンティティ タイプとオプションの最大深さを受け取り、インクルード パスのリストを返します。

これらの拡張メソッドを汎用リポジトリ メソッドに組み込むことにより、次のようになります。

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 2.0.1 で、ネストされた関連エンティティを積極的に読み込むことができるようになりました。このアプローチは、より包括的な積極的な読み込みメカニズムを提供し、明示的な Include ステートメントと ThenInclude ステートメントの必要性を排除します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。