linq-to-sql连接多个from子句语法与传统连接语法

时间:2012-07-31 21:57:53

标签: c# sql linq-to-sql

使用2个from子句和where这样写一个联接有什么区别:

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

并使用join运算符编写join

这适用于2个表格上的join,但有时,我们需要加入更多的表格,如果我们选择其他from子句,我们需要将其与where结合起来上面的语法。

我知道两种语法查询都返回相同的数据,但我想知道是否存在性能差异或其他类型的差异,这将最终支持一种语法而不是另一种语法。

感谢您的建议。

2 个答案:

答案 0 :(得分:17)

这两个问题实际上回答得很好。

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。这是一个很好的工具,可以搞清楚这种东西。

答案 1 :(得分:-2)

var result = from a in DB.classA
from b in DB.classB
where a.id.Equals(b.id)
select new{a.b};