如何使用EF Core查询匹配多组TableName与Name值对的数据库ID
问题原因
你写的查询报错是因为EF Core无法将本地自定义Columns类集合的Any比较逻辑转换为可执行的SQL语句。
解决方案
方案1:兼容所有EF Core版本(字符串拼接法)
先把筛选条件的两列拼接为唯一字符串,用EF Core支持的Contains方法生成IN查询,分隔符请选择不会出现在Name、TableName字段中的字符即可:
// 构造筛选键集合 var filterKeys = listOfColumns.Select(c => $"{c.Name}||{c.TableName}").ToList(); // 执行查询,如需仅返回ID可添加Select投影 var newListWithID = _context.DBId .Where(d => filterKeys.Contains($"{d.Name}||{d.TableName}")) .Select(d => d.ID) .ToList();
方案2:EF Core 7+ 原生多列匹配
EF Core 7及以上版本已支持匿名类型集合的Contains操作,会自动翻译为多列IN语句,无需拼接字符串,不会出现误匹配问题:
// 构造匿名类型的筛选键集合 var filterKeys = listOfColumns.Select(c => new { c.Name, c.TableName }).ToList(); var newListWithID = _context.DBId .Where(d => filterKeys.Contains(new { d.Name, d.TableName })) .Select(d => d.ID) .ToList();
两种方案都不需要手动循环遍历本地集合,筛选逻辑会全部转换为SQL在数据库端执行。
内容的提问来源于stack exchange,提问作者user3559195
相关产品推荐
相关产品推荐

