请求将给定SQL查询转换为LINQ语句
SQL转LINQ实现方案
核心逻辑说明
原SQL从laqTasks表左连接laqEmployees表,过滤条件为:
- 任务的
duty在laqSyncDutyList的SyncDutyId集合中,或任务的maint等于1 - 同时满足
nvupdatesw等于1
最终仅返回taskid和status字段。
完整LINQ实现(含左连接)
查询语法
// 先获取同步职责ID集合,避免重复查询数据库 var syncDutyIds = db.laqSyncDutyList.Select(s => s.SyncDutyId).ToList(); var query = from task in db.laqTasks.AsNoTracking() join emp in db.laqEmployees.AsNoTracking() on task.lastupdatedby equals emp.employeeid into empGroup from emp in empGroup.DefaultIfEmpty() // 左连接处理 where (syncDutyIds.Contains(task.duty) || task.maint == 1) && task.nvupdatesw == 1 select new { task.taskid, task.status };
方法语法
var syncDutyIds = db.laqSyncDutyList.Select(s => s.SyncDutyId).ToList(); var query = db.laqTasks.AsNoTracking() .GroupJoin( db.laqEmployees.AsNoTracking(), task => task.lastupdatedby, emp => emp.employeeid, (task, empGroup) => new { Task = task, EmpGroup = empGroup } ) .SelectMany( x => x.EmpGroup.DefaultIfEmpty(), (x, emp) => new { x.Task } ) .Where(x => (syncDutyIds.Contains(x.Task.duty) || x.Task.maint == 1) && x.Task.nvupdatesw == 1) .Select(x => new { x.Task.taskid, x.Task.status });
优化版(移除无用左连接)
由于原SQL左连接laqEmployees后并未使用该表的任何字段,可直接简化查询:
var syncDutyIds = db.laqSyncDutyList.Select(s => s.SyncDutyId).ToList(); var query = db.laqTasks.AsNoTracking() .Where(task => (syncDutyIds.Contains(task.duty) || task.maint == 1) && task.nvupdatesw == 1) .Select(task => new { task.taskid, task.status });
补充说明
AsNoTracking()对应SQL中的WITH(NOLOCK),用于关闭实体跟踪,提升查询效率,实现类似脏读的效果;EF Core中也可通过FromSqlRaw直接指定NOLOCK,但上述方式适配性更强。- 提前将
syncDutyIds转为List,避免EF多次生成子查询,提升性能;若需保持子查询形式,可替换为db.laqSyncDutyList.Any(s => s.SyncDutyId == task.duty)。
内容的提问来源于stack exchange,提问作者shanthakumar n
相关产品推荐
相关产品推荐

