.net core 使用ToLookup太慢(C#、.NET内核、EntityFrameworkCore)

.net core 使用ToLookup太慢(C#、.NET内核、EntityFrameworkCore),.net-core,entity-framework-core,.net Core,Entity Framework Core,我需要帮助来加速这段代码 使用EntityFrameworkCore 3,.NET Core 3.1 var groups = _context.IPItem .OrderBy(x => x.ParentId).ThenBy(x => x.OrderInIndex) .Where(x => x.BibNum == BibNumber) .ToLookup(x => x.Pare

我需要帮助来加速这段代码

使用
EntityFrameworkCore 3
.NET Core 3.1

var groups = _context.IPItem
                .OrderBy(x => x.ParentId).ThenBy(x => x.OrderInIndex)
                .Where(x => x.BibNum == BibNumber)
                .ToLookup(x => x.ParentId, x => new IPItemViewModel
                {
                    IPItemId = x.IPItemId,
                    ResourceText = x.ResourceText,
                    ResourceLink = x.ResourceLink,
                    FullResourceLink = x.FullResourceLink,
                    OrderInIndex = x.OrderInIndex,
                    ExtraInfo = x.ExtraInfo
                });
当与特定的
BibNumber
相关联的
父ID有多层嵌套时,
“ToLookup”
可能是一个很大的瓶颈

我很想看看
TSQL
中的
“ToLookup”
部分是什么样子的,但似乎找不到一种方法来做到这一点

我试图弄清楚将
ToLookup
更改为
GroupBy
,是否会更快,但我不确定如何做到这一点

有什么建议吗

该表具有以下属性:

IPItemId int NOT NULL, Primary Key
ParentId int NULL
BibNum string NOT NULL
ResourceText string NOT NULL
ResourceLink string NOT NULL
FullResourceLink string NOT NULL
OrderInIndex int NULL
ExtraInfo string NOT NULL

通过在数据库中的表上实现索引,我能够加快查询速度

CREATE NONCLUSTERED INDEX IX_IndexPageItem_bibNum_parent 
   ON IPItem (bibNum ASC, ParentId ASC, orderInIndex ASC); 
只有当我在将所有内容插入数据库之前(而不是之后)实现索引时,它才加快了进程。
谢谢大家的关注,谢谢

无论如何,我怀疑GroupBy的生成速度会更快,但实际上它只是将其改为
.Select(x=>new{ParentId=x.ParentId;/*other stuff*/})。GroupBy(x=>x.ParentId)
,然后处理生成的GroupingIt也可能总是大量的数据。确保将任何筛选器和/或分页推送到IQueryable级别。
ToLookup
Enumerable
扩展方法,因此与SQL无关(执行客户端)。如果您有性能问题,它必须位于查询的db部分(在
ToLookup()
之前)-您可以通过将
ToLookup
替换为
ToList
来验证这一点。我会先删除
OrderBy
/
然后再删除
并添加
AsNoTracking()。我试着按照如下方式拆分代码,并在这两个部分周围放置一个计时器。这部分很快:
var-groupList=\u context.IndexPageItem.OrderBy(x=>x.ParentId)。然后by(x=>x.OrderInIndex)。其中(x=>x.BibNum==BibNumber)如果存在大量嵌套的ParentId,则此部分可能需要很长时间:
var groups=groupList.ToLookup(x=>x.ParentId,x=>new IndexPageItemVM{IndexPageItemId=x.IndexPageItemId,ResourceText=x.ResourceText,ResourceLink=x.ResourceLink,FullResourceLink=x.FullResourceLink,OrderInIndex=x.OrderInIndex,ExtraInfo=x.ExtraInfo});