EF Core:如何翻译“With table AS”

4

我正在尝试使用EF Core获取嵌套类别。问题是速度太慢。

看看我的代码:

    public async Task<List<Category>> GetNestedCategoryAsync(Category category)
    {
        if (category is null)
            return new List<Category>();

        IQueryable<Category> query = db.Categories.Include(x => x.Childs).Include(x => x.Products).Where(x => category.Childs.Contains(x)).AsNoTracking();

        List<Category> nestedCategories = await query.ToListAsync();

        foreach (Category nestedCategory in nestedCategories.ToArray())
            nestedCategories.AddRange(await GetNestedCategoryAsync(nestedCategory));

        return nestedCategories;
    }

实际上,我不知道如何将这个SQL翻译成EF。可能吗?它的速度快了千倍。

With Categories_CTE As
(
Select *
From Categories
Where Id = 8692

Union All
Select t.*
From Categories t
Inner Join Categories_CTE c On c.Id = t.ParentId
)

Select c.*
From Categories_CTE c;

感谢任何技巧

本地SQL通常(总是?)比EF更快,是的。 - Jacob H
1个回答

2

Entity Framework 永远不会生成 CTE,这对它来说是一步太远了。但是,您可以像这样通过 EF Core 使用 SQL:

var categories = db.Categories.FromSql("WITH Categories_CTE AS .......");

好的,感谢您提供的信息,我也找到了这种方式。是否有任何教程可以告诉我如何像我发布的查询一样翻译Include为INNER JOIN?只需要在Products ON x... 进行内部连接吗? - user1085907
你应该能够执行db.Categories.FromSql("...").Include(c => c.Childs) - DavidG
1
我遇到了错误"The Include operation is not supported when calling a stored procedure.",所以我必须选择它并且以某种方式进行导航。 - user1085907

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接