You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过List<Guid>高效获取List<Item>?

高效批量查询Item的EF Core实现方法

一、EF Core 最优实现方案

直接使用Contains方法即可,EF Core会自动将其转换为SQL的IN语句,仅执行一次数据库查询,完全满足高效需求。

假设Item实体中存储Guid的属性名为Id,正确写法如下:

public async Task<List<Item>> GetListOfItems(List<Guid> guids)
{
    // 过滤空Guid,避免无效查询
    var validGuids = guids.Where(g => g != Guid.Empty).ToList();
    if (!validGuids.Any())
    {
        return new List<Item>();
    }
    
    return await context.Items
        .Where(item => validGuids.Contains(item.Id))
        .ToListAsync();
}

二、进阶优化:保持返回结果与传入Guid顺序一致

如果需要返回的Item列表顺序和传入的guids列表完全匹配,可通过Join实现:

public async Task<List<Item>> GetListOfItems(List<Guid> guids)
{
    var validGuids = guids.Where(g => g != Guid.Empty).ToList();
    if (!validGuids.Any())
    {
        return new List<Item>();
    }
    
    var items = await context.Items
        .Where(item => validGuids.Contains(item.Id))
        .ToListAsync();
    
    // 按传入的Guid顺序排序
    return validGuids
        .Join(items, guid => guid, item => item.Id, (_, item) => item)
        .ToList();
}

三、备选方案:SQL存储过程(仅当EF Core无法满足时使用)

如果确实需要用存储过程,这里提供SQL Server环境下的简单示例:

  1. 先定义表类型与存储过程:
-- 创建表类型
CREATE TYPE dbo.GuidList AS TABLE (GuidValue UNIQUEIDENTIFIER)

-- 创建存储过程
CREATE PROCEDURE GetItemsByGuids
    @Guids dbo.GuidList READONLY
AS
BEGIN
    SELECT * FROM Items WHERE Id IN (SELECT GuidValue FROM @Guids)
END
  1. EF Core中调用存储过程:
public async Task<List<Item>> GetListOfItems(List<Guid> guids)
{
    var validGuids = guids.Where(g => g != Guid.Empty).ToList();
    if (!validGuids.Any())
    {
        return new List<Item>();
    }
    
    // 将Guid列表转换为表值参数
    var guidTable = new DataTable();
    guidTable.Columns.Add("GuidValue", typeof(Guid));
    foreach (var guid in validGuids)
    {
        guidTable.Rows.Add(guid);
    }
    
    return await context.Items
        .FromSqlRaw("EXEC GetItemsByGuids @Guids", new SqlParameter("@Guids", SqlDbType.Structured)
        {
            TypeName = "dbo.GuidList",
            Value = guidTable
        })
        .ToListAsync();
}

内容的提问来源于stack exchange,提问作者Jimmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:30:58