C# 如何将Linq转换为Sql?
我想为表编写代码,我知道SQL Server,但我不知道Linq或EF SQL Server代码:C# 如何将Linq转换为Sql?,c#,sql,sql-server,entity-framework,linq,C#,Sql,Sql Server,Entity Framework,Linq,我想为表编写代码,我知道SQL Server,但我不知道Linq或EF SQL Server代码: SELECT * FROM Driver WHERE id IN (SELECT Driver FROM Drive_Car WHERE Drive_Car.Finish_Date IS NOT NULL) 我在EF中编写了此代码,但与SQL Server结果不匹配: var drivers = db.Drivers
SELECT *
FROM Driver
WHERE id IN (SELECT Driver
FROM Drive_Car
WHERE Drive_Car.Finish_Date IS NOT NULL)
我在EF中编写了此代码,但与SQL Server结果不匹配:
var drivers = db.Drivers
.Where(d => db.Drive_Car
.Where(dc => dc.Driver == d.ID && dc.Finish_Date != null)
.Select(dc => dc.Driver)
.Contains(d.ID));
使用联接操作可以得到相同的结果。或将命令拆分为两部分 类似Linq SQL的语法: 其他方法(分为两部分) 参考文献:
- 这就足够了:
var drivers = db.Drivers
.Where(d => db.Drive_Car
.Any(dc => dc.Driver == d.ID && dc.Finish_Date != null));
这导致
存在
,这最终与方法中的大致相同。通过join复制行并通过distinct
将行反求回来并不总是经过优化,最终可能会导致超出必要的开销,因此我不希望采用这种方式。如果您想将Sql转换为Linq,那么为什么您的标题说的正好相反?不,此表单,我希望以任何方式获得类似sql server的代码linq它与sql server结果不匹配
,以哪种方式?生成的SQL是什么?我同意使用distinct进行连接不是最佳做法。我还提供了另一种方法,将命令分为两部分。但我认为您提供的语法比+1更好
var lst =
(from dc in dc.Drive_Car
where dc.Finish_Date != null
select dc.Driver).Distinct().ToList();
var query =
(from d in db.Driver
where lst.Contains(d.ID)
select d);
var drivers = db.Drivers
.Where(d => db.Drive_Car
.Any(dc => dc.Driver == d.ID && dc.Finish_Date != null));