如何通过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环境下的简单示例:
- 先定义表类型与存储过程:
-- 创建表类型 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
- 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
相关产品推荐
相关产品推荐

