我正在使用 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()
扩展我假设实体
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();
}