有没有办法准确地将以下 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 看起来更简单一些。因此,问题仅出于我的知识目的。
答案 0 :(得分:2)
从字面上翻译您的查询,我们得到以下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>
,您可以根据需要使用它。
据我所知,没有关于转换语法的“文档”,作为开发人员,这是你的工作。但是,我个人认为LINQPad在构造LINQ语句时非常有用。