将嵌套的SQL查询转换为LINQ查询

时间:2017-02-01 09:46:27

标签: c# sql-server linq nested-queries

有没有办法准确地将以下 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 看起来更简单一些。因此,问题仅出于我的知识目的。

1 个答案:

答案 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语句时非常有用。