将嵌套 SQL 查询转换为 LINQ 查询
Convert nested SQL query to LINQ Query
有没有办法将下面的SQL查询准确转换为LINQ
SELECT * FROM T1
WHERE ColumnA IN (
SELECT FkColumnA FROM T2
WHERE FkColumnB IN (
SELECT ColumnB FROM T3
WHERE FkColumnC IN (
SELECT ColumnC FROM T4
WHERE FkColumnD = 1)) AND FkColumnE is null AND ColumnF = 0)
另外,有人知道任何文档,其中列出了将 SQL 查询转换为 LINQ 的任何逻辑或指南吗?
编辑 1:
上面使用 JOINS 的等价物如下:
select * from T1 a
inner join T2 b on a.FKColumnA = b.ColumnA
inner join T3 c on c.ColumnB = b.FkColumnB
inner join T4 d on d.ColumnC = c.FkColumnC
where a.FkColumnD is null and a.ColumnE = 0
and d.ColumnC = 1
它等效的 LINQ 查询是
var linq = from q in context.T1
join r in context.T2
on q.FKColumnA equals r.ColumnA
join s in context.T3
on r.FkColumnB equals s.ColumnB
join t in context.T4
on s.FkColumnC equals t.ColumnC
where q.FkColumnD != null && q.ColumnE == false && t.ColumnC == 56816
select q.FkColumnF;
但是在 LINQ 中使用 JOINS 看起来更加简单和更好。所以这个问题只是为了我的知识目的。
从字面上翻译您的查询,我们得到以下 LINQ 语句:
var results = table1.Where(t1 => table2.Where(
t2 =>
table3.Where(
t3 =>
table4.Where(t4 => t4.FkColumnD == 1)
.Select(t4 => t4.ColumnC)
.Contains(t3.FkColumnC))
.Select(t3 => t3.ColumnB)
.Contains(t2.FkColumnB) && !t2.FkColumnE.HasValue && t2.ColumnF == 0)
.Select(t2 => t2.FkColumnA)
.Contains(t1.ColumnA));
这会生成一个 IEnumerable<T1>
,您可以根据需要使用它。
据我所知,没有 "documentation" 转换语法,作为开发人员,这是您的工作。但是,我个人发现 LINQPad 在构造 LINQ 语句时非常有用。
有没有办法将下面的SQL查询准确转换为LINQ
SELECT * FROM T1
WHERE ColumnA IN (
SELECT FkColumnA FROM T2
WHERE FkColumnB IN (
SELECT ColumnB FROM T3
WHERE FkColumnC IN (
SELECT ColumnC FROM T4
WHERE FkColumnD = 1)) AND FkColumnE is null AND ColumnF = 0)
另外,有人知道任何文档,其中列出了将 SQL 查询转换为 LINQ 的任何逻辑或指南吗?
编辑 1:
上面使用 JOINS 的等价物如下:
select * from T1 a
inner join T2 b on a.FKColumnA = b.ColumnA
inner join T3 c on c.ColumnB = b.FkColumnB
inner join T4 d on d.ColumnC = c.FkColumnC
where a.FkColumnD is null and a.ColumnE = 0
and d.ColumnC = 1
它等效的 LINQ 查询是
var linq = from q in context.T1
join r in context.T2
on q.FKColumnA equals r.ColumnA
join s in context.T3
on r.FkColumnB equals s.ColumnB
join t in context.T4
on s.FkColumnC equals t.ColumnC
where q.FkColumnD != null && q.ColumnE == false && t.ColumnC == 56816
select q.FkColumnF;
但是在 LINQ 中使用 JOINS 看起来更加简单和更好。所以这个问题只是为了我的知识目的。
从字面上翻译您的查询,我们得到以下 LINQ 语句:
var results = table1.Where(t1 => table2.Where(
t2 =>
table3.Where(
t3 =>
table4.Where(t4 => t4.FkColumnD == 1)
.Select(t4 => t4.ColumnC)
.Contains(t3.FkColumnC))
.Select(t3 => t3.ColumnB)
.Contains(t2.FkColumnB) && !t2.FkColumnE.HasValue && t2.ColumnF == 0)
.Select(t2 => t2.FkColumnA)
.Contains(t1.ColumnA));
这会生成一个 IEnumerable<T1>
,您可以根据需要使用它。
据我所知,没有 "documentation" 转换语法,作为开发人员,这是您的工作。但是,我个人发现 LINQPad 在构造 LINQ 语句时非常有用。