Linq循环字符串列表存储结果至var变量的技术问题求助
问题描述
有如下代码示例:
List<string> userIds = userAppService.GetUserIds() .Where(usr => usr.Status == "Active") .Select(u => u.User_Id) .ToList();
想要遍历上述UserId列表,将查询结果存入var变量中,尝试代码如下:
foreach(string str in userIds) { var result = SLSDBContext.USER_HISTORY .Where(i => i.UserId == str) .Select(x => new { x.UserId, x.LogCount, x.IsRegistered }); return this.Json(result) }
但这段代码存在问题:无法在foreach块外部访问result变量;若在foreach块前声明result变量,又无法为其指定类型。
曾尝试使用Linq的Any()运算符,但未得到预期结果,尝试代码如下:
var result = SLSDBContext.USER_HISTORY .Where(i => i.UserId.Contains(userIds)) .Select(x => new { x.UserId, x.LogCount, x.IsRegistered });
请问有没有更好的方法实现需求?
解决方案
你的核心需求是批量查询所有活跃用户的USER_HISTORY记录,无需用foreach循环逐条查询,直接用Linq的Contains方法即可实现批量匹配,这比循环查询效率更高(减少数据库请求次数)。
修正后的批量查询代码
// 获取活跃用户ID列表 List<string> userIds = userAppService.GetUserIds() .Where(usr => usr.Status == "Active") .Select(u => u.User_Id) .ToList(); // 批量查询匹配的USER_HISTORY记录 var result = SLSDBContext.USER_HISTORY .Where(i => userIds.Contains(i.UserId)) // 正确用法:集合.Contains(单个元素) .Select(x => new { x.UserId, x.LogCount, x.IsRegistered }) .ToList(); // 按需添加ToList(),触发立即执行查询 return this.Json(result);
关键说明
- 你之前的错误是
Contains调用顺序颠倒:应该是userIds.Contains(i.UserId)(检查用户ID是否在活跃列表中),而非i.UserId.Contains(userIds)(错误地检查单个字符串是否包含整个集合)。 - 批量查询能避免多次数据库往返,性能远优于循环逐条查询,是这类场景的最优解。
特殊场景:必须逐条处理的情况
如果业务要求必须对每个用户ID单独处理,可提前声明一个动态类型列表来收集结果:
List<dynamic> resultList = new List<dynamic>(); foreach(string str in userIds) { var item = SLSDBContext.USER_HISTORY .Where(i => i.UserId == str) .Select(x => new { x.UserId, x.LogCount, x.IsRegistered }) .FirstOrDefault(); // 假设每个用户对应一条记录,按需调整 if(item != null) { resultList.Add(item); } } return this.Json(resultList);
但这种方式仅在特殊业务场景下使用,优先推荐批量查询方案。
内容的提问来源于stack exchange,提问作者sumit sri
相关产品推荐
相关产品推荐

