使用 Entity Framework Core 的最小 API - 由于数据库中的图像而导致性能不佳

问题描述 投票:0回答:1

我正在使用 Entity Framework Core 为 ASP.NET Core v8 Minimal API 编写 API。端点之一应该获取特定项目组中的所有项目。这些项目位于两个表中,其中主表用于基本信息,另一个表就像我存储图像的存档,图像以原始格式存储。

这是我加载数据的代码:

static async Task<IResult> GetItemsByGroup(Pico2024Context db, string GroupGuid)
{
    return TypedResults.Ok(
        await db.Tbl007s
        .Select(itm => new 
        {
            itm.CardGuide, 
            itm.CardCode, 
            itm.ProductName, 
            itm.Barcode, 
            itm.GroupGuid,
            itm.CardImage,
            MainImage = itm.Tbl152s.Select(itm => new {
                itm.CardImage,
            }).FirstOrDefault()
        })
        .Where(srch => srch.GroupGuid.ToString() == GroupGuid)
        .OrderBy(ord => ord.ProductName).ToListAsync()
    );
}

Tbl007
为主表,
Tbl152
为相关表。

问题

当我运行代码时,大约需要 6 分钟才能获取 300 条记录,因为我知道在这 300 条记录中,只有 10 条记录在相关表中具有图像。

我尝试过的:

  • 延迟加载代理服务
  • 预加载 (
    .Include()
    )
  • AsNoTracking()
    扩展
asp.net-core entity-framework-core lazy-loading eager-loading minimal-apis
1个回答
0
投票

我假设实体

Tbl152
Tbl007
定义了某种关系,例如
Tbl007Id

我还假设

Tbl007
已定义
Guid Id
键。

那么我们可以这样处理这个问题:

static async Task<IResult> GetItemsByGroup(Pico2024Context db, string GroupGuid)
{
    var items = await db.Tbl007s
        .Select(itm => new 
        {
            itm.CardGuide, 
            itm.CardCode, 
            itm.ProductName, 
            itm.Barcode, 
            itm.GroupGuid,
            itm.CardImage,
        })
        .Where(srch => srch.GroupGuid.ToString() == GroupGuid)
        .OrderBy(ord => ord.ProductName)
        .ToListAsync();
        
    // Lazily load images as needed
    var relatedImages = GetRelatedImages(db, items.Select(x => x.Id).ToArray());
        
    return TypedResults.Ok(
        // Here you join everything and create final result.
    );
}

static async Task<Tbl152[]> GetRelatedImages(Pico2024Context db, Guid[] itemIds)
{
    return await db.Tbl152.Where(x => itemsIds.Contains(x.Tbl007Id)).ToArray();
}
© www.soinside.com 2019 - 2024. All rights reserved.