在EF Core中使用EntityFrameworkQueryableExtensions.ThenInclude

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?

熱門答案

不是將表達式傳遞給Include()方法,而是可以使用兩個帶有字符串的重載。

第一個採用單個屬性或多級屬性,如下所示:

Include("property1")

要么

Include("property1.property2.property3")

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

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

如果你有一個通用的加載方法,它接受一個字符串數組迭代和“包含”(你正在迭代你的數組的方式完全相同),那麼你可以使用第一個重載(一個字符串)並做像這樣的東西:

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

因此,您仍然只使用一個Include()方法而不向存儲庫添加任何其他邏輯,但您現在可以根據需要“包含”多個級別。

要查看這些重載的來源,可以在此處查看



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow