我试图定义一个通用的加载方法。 我用这样的表达式数组来调用这个泛型加载方法:
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? p>
答案 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