C# EntityFrameworkQueryableExtensions.ThenInclude在EF Core中的使用

C# EntityFrameworkQueryableExtensions.ThenInclude在EF Core中的使用,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我试图定义一个通用的加载方法。 我使用如下表达式数组调用此通用加载方法: var includes = new Expression<Func<CatalogItem, object>>[] { ci => ci.Catalog.Select(ci => ci.Supplier.Region), ci => ci.Test } foreach (var include in includes) {

我试图定义一个通用的加载方法。 我使用如下表达式数组调用此通用加载方法:

var includes = new Expression<Func<CatalogItem, object>>[]
    {
        ci => ci.Catalog.Select(ci => ci.Supplier.Region),
        ci => ci.Test
    }
foreach (var include in includes)
    {
        queryable = queryable.Include(include);
    }
MyGenericRepo.MySetInclude(new string[] {$"{nameof(ParentEntity.ChildEntity)}.{nameof(ChildEntity.GrandchildEntity)}"});
但这仅在表达式只有一个级别时有效。在多个级别中,它会抛出一个错误。 因为没有包含,所以我必须使用EntityFrameworkQueryableExtensions。我是这样试的

queryable = EntityFrameworkQueryableExtensions.ThenInclude(queryable, include);
但这也不起作用


我找不到有关此问题的任何文档。如何解决此问题以及如何使用EntityFrameworkQueryableExtensions。然后是Include?

可以使用两个重载来获取字符串,而不是将表达式传递给Include方法

第一个属性采用单个属性或多级属性,如下所示:

Include("property1")

第二种方法利用了nameof方法,如下所示:

Include(nameof(property1), nameof(property2), nameof(property3))
如果您有一个通用加载方法,该方法使用字符串数组进行迭代,并以与当前迭代数组完全相同的方式包含,那么您可以使用第一个重载字符串并执行如下操作:

var includes = new Expression<Func<CatalogItem, object>>[]
    {
        ci => ci.Catalog.Select(ci => ci.Supplier.Region),
        ci => ci.Test
    }
foreach (var include in includes)
    {
        queryable = queryable.Include(include);
    }
MyGenericRepo.MySetInclude(new string[] {$"{nameof(ParentEntity.ChildEntity)}.{nameof(ChildEntity.GrandchildEntity)}"});
因此,您仍然只使用one-Include方法,而不向存储库添加任何其他逻辑,但现在可以根据需要包含任意多个级别


要查看这些重载的起源,您可以查看它

查看其中一些解决方案有错误,并且没有一个在通用设置下工作