【问题标题】:How To Convert Linq To Sql?如何将 Linq 转换为 Sql?
【发布时间】:2019-01-05 19:16:07
【问题描述】:

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

【问题讨论】:

  • 如果你想把Sql转成Linq,那为什么你的标题说正好相反
  • 没有这个表单,我想通过任何方式获取代码 linq,如 sql server
  • it does not match the SQL Server result 以哪种方式?生成的 SQL 是什么?

标签: c# sql sql-server entity-framework linq


【解决方案1】:

这就够了:

var drivers = db.Drivers
                .Where(d => db.Drive_Car
                              .Any(dc => dc.Driver == d.ID && dc.Finish_Date != null));

这导致Exists,最终与IN 方法大致相同。通过 join 复制行并通过 distinct 将它们统一化并不总是优化掉,您最终可能会产生不必要的开销,所以我不喜欢这种方式。

【讨论】:

  • 我同意以 distinct 加入不是最佳做法。我还提供了另一种方法,将命令分成两部分。但我认为您提供的语法更好+1
【解决方案2】:

您可以使用 Join 操作获得相同的结果。或者将命令分成两部分。

Linq SQL-Like 语法:

var query =
   (from d in db.Driver
   join dc in dc.Drive_Car on dc.Driver equals d.ID
   where dc.Finish_Date != null
   select d).Distinct();

其他方法(分成两部分)

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);

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-10-02
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多