.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});