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

ASP.NET Core MVC中不使用SQL如何实现IN/NOT IN等效查询

EF Core 实现 SQL IN/NOT IN 等效筛选方案

在ASP.NET Core MVC中用EF Core做数据访问时,直接通过LINQ语法就能实现和SQL IN/NOT IN完全一致的筛选效果,全程不需要手写原生SQL、调用存储过程,也不需要使用SqlDataAdapter组件,EF Core会自动将LINQ查询翻译成对应数据库的参数化SQL执行。


对应IN操作符的实现(匹配给出的SQL示例)

示例SQL的逻辑是查询所有在缴费表有记录的学生,核心是判断学生ID是否存在于缴费表的学生ID集合中,对应LINQ里用Contains方法实现,和SQL的IN逻辑完全等价。

符合期望格式的查询语法写法

// 先取出缴费表中所有已登记的学生ID集合
var existStudentIds = _context.FeeEntries.Select(f => f.StudentID).ToList();

// 等效SQL IN 查询
var myvalues = (from student in _context.Students
                where existStudentIds.Contains(student.StudentID)
                select student).ToList();

更优的关联查询写法(无需提前查ID集合)

如果实体类已经按照外键配置了导航属性,直接用Any做关联判断即可,EF Core会自动翻译成EXISTS或IN语句,性能比提前拉取ID集合更好,也省去了单独维护ID集合的步骤:

var myvalues = (from student in _context.Students
                where _context.FeeEntries.Any(fee => fee.StudentID == student.StudentID)
                select student).ToList();

对应NOT IN操作符的实现

逻辑和IN一致,只需要在判断条件前加逻辑非运算符!即可:

// 写法1:Contains取反,对应NOT IN:查询没有缴费记录的学生
var existStudentIds = _context.FeeEntries.Select(f => f.StudentID).ToList();
var studentsNotPay = (from student in _context.Students
                      where !existStudentIds.Contains(student.StudentID)
                      select student).ToList();

// 写法2:Any取反的关联写法
var studentsNotPay = (from student in _context.Students
                      where !_context.FeeEntries.Any(fee => fee.StudentID == student.StudentID)
                      select student).ToList();

注意事项

  • 传给Contains的必须是单字段的基本类型集合(比如int、Guid类型的ID集合),不能直接传入整个表的实体对象集合,否则会抛出翻译异常
  • 如果匹配的ID集合数据量超过万级,优先选择Any关联写法,避免SQL语句中IN后的参数列表过长导致性能下降
  • 所有写法生成的都是参数化SQL,不存在SQL注入风险

内容的提问来源于stack exchange,提问作者bs180201421 MUHAMMAD SHADAB SK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:06:29