将嵌套 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 语句时非常有用。