【问题标题】:linq-to-sql joins with multiple from clauses syntax vs. traditional join syntax使用多个 from 子句语法与传统连接语法的 linq-to-sql 连接
【发布时间】:2012-07-31 21:57:52
【问题描述】:

使用 2 个 from 子句和像这样的 where 编写连接有什么区别:

var SomeQuery = from a in MyDC.Table1
                from b in MyDC.Table2
                where a.SomeCol1 == SomeParameter && a.SomeCol2 === b.SomeCol1

并使用连接运算符编写join

这是针对 2 个表上的 join,但当然,有时,我们需要连接更多表,如果我们选择上述语法,我们需要将其他 from 子句与 where 结合起来。

我知道两种语法查询都返回相同的数据,但我想知道是否存在性能差异或另一种差异,最终会偏向于一种语法。

感谢您的建议。

【问题讨论】:

    标签: c# sql linq-to-sql


    【解决方案1】:

    这两个问题其实回答的都很好。

    INNER JOIN ON vs WHERE clause

    INNER JOIN vs multiple table names in "FROM"

    我提供了两个示例,说明如何将三种不同的 LINQ 表达式转换为 SQL。

    隐式连接:

    from prod in Articles
    from kat in MainGroups
    where kat.MainGroupNo == prod.MainGroupNo
    select new { kat.Name, prod.ArticleNo }
    

    会被翻译成

    SELECT [t1].[Name], [t0].[ArticleNo]
    FROM [dbo].[Article] AS [t0], [dbo].[MainGroup] AS [t1]
    WHERE [t1].[MainGroupNo] = [t0].[MainGroupNo]
    

    内连接:

    from prod in Articles
    join kat in MainGroups on prod.MainGroupNo equals kat.MainGroupNo
    select new { kat.Name, prod.ArticleNo }
    

    会被翻译成

    SELECT [t1].[Name], [t0].[ArticleNo]
    FROM [dbo].[Article] AS [t0]
    INNER JOIN [dbo].[MainGroup] AS [t1] ON [t0].[MainGroupNo] = [t1].[MainGroupNo]
    

    左外连接:

    from prod in Articles
    join g1 in MainGroups on prod.MainGroupNo equals g1.MainGroupNo into prodGroup
    from kat in prodGroup.DefaultIfEmpty()
    select new { kat.Name, prod.ArticleNo }
    

    会被翻译成

    SELECT [t1].[Name] AS [Name], [t0].[ArticleNo]
    FROM [dbo].[Article] AS [t0]
    LEFT OUTER JOIN [dbo].[MainGroup] AS [t1] ON [t0].[MainGroupNo] = [t1].[MainGroupNo]
    

    如果你想测试你的表达式将如何被翻译成 SQL,我建议你试试LINQPad。这是找出这类东西的绝佳工具。

    【讨论】:

    【解决方案2】:
    var result = from a in DB.classA
    from b in DB.classB
    where a.id.Equals(b.id)
    select new{a.b};
    

    【讨论】:

    • 这并没有回答问题,也没有提供任何解释。
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多