C# 如何将Linq转换为Sql?

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

我想为表编写代码,我知道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
                .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));