如何以编程方式分解 EF Core 包含子句

问题描述 投票:0回答:0

我的 EF Core 应用程序使用旨在通过允许在运行时指定导航属性加载来支持灵活的实体查询的设计模式。这个模式有 3 个关键元素:

  1. 声明代表 EF Core 包含表达式的委托
public delegate IIncludableQueryable<T, object> IncludeClause<T>(IQueryable<T> value);
  1. 创建此委托的预定义实例,代表各种场景的包含表达式:
public static IncludeClause<Blog> BlogFull => entities =>
    entities
        .Include(e => e.Author)
        .Include(e => e.Posts)
            .ThenInclude(e => e.Comments);
  1. 创建根据传递的包含子句调整其属性加载行为的实体查询方法:
public async Task<Blog> GetBlog(int id, IncludeClause<Blog> include)
{
    return await include(_context.Set<Blog>()).FirstAsync(blog => blog.Id == id);
}

上述模式运行良好,但现在我正在寻找一种方法来以编程方式分解任何预定义的包含子句,以确定它引用的实体类型集。

在上面的例子中,我期望这个分解的结果是一个类型数组,像这样:

new[] { typeof(Blog), typeof(Author), typeof(Post), typeof(Comment), }

任何人都可以建议如何解析上面的

BlogFull
表达式树以确定它引用的实体类型吗?

c# entity-framework-core expression-trees iqueryable
© www.soinside.com 2019 - 2024. All rights reserved.