在EF Core中使用EntityFrameworkQueryableExtensions.ThenInclude

时间:2017-06-07 20:02:47

标签: c# entity-framework entity-framework-core

我试图定义一个通用的加载方法。 我用这样的表达式数组来调用这个泛型加载方法:

var includes = new Expression<Func<CatalogItem, object>>[]
    {
        ci => ci.Catalog.Select(ci => ci.Supplier.Region),
        ci => ci.Test
    }

在方法中我创建了一个IQueryable:

IQueryable<TAggregateRoot> queryable = dbContext.Set<TAggregateRoot>();

然后对于每个表达式,我想加载相应的数据,如下所示:

foreach (var include in includes)
    {
        queryable = queryable.Include(include);
    }

但这仅在Expression只有一个级别时才有效。有多个级别会引发错误 由于没有ThenInclude,我必须使用EntityFrameworkQueryableExtensions。我试过这样的

queryable = EntityFrameworkQueryableExtensions.ThenInclude(queryable, include);

但这也不起作用。

我无法找到此问题的任何文档。如何解决此问题以及如何使用EntityFrameworkQueryableExtensions.ThenInclude?

1 个答案:

答案 0 :(得分:0)

不是将表达式传递给Include()方法,而是可以使用两个带有字符串的重载。

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

Include("property1")

OR

Include("property1.property2.property3")

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

Include(nameof(property1), nameof(property2), nameof(property3))

如果你有一个通用的加载方法,它需要一个字符串数组来迭代并且“包含”(你正在以相同的方式迭代你的数组),那么你可以使用第一个重载(一个字符串) )并做这样的事情:

MyGenericRepo.MySetInclude(new string[] {$"{nameof(ParentEntity.ChildEntity)}.{nameof(ChildEntity.GrandchildEntity)}"});

因此,您仍然只使用一个Include()方法而不向存储库添加任何其他逻辑,但您现在可以“包含”任意数量的级别。

要查看这些重载的来源,可以查看here