13

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

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

join并使用连接运算符编写一个。

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

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

感谢您的建议。

4

2 回答 2

19

这个问题实际上在这两个中得到了很好的回答。

INNER JOIN ON vs WHERE 子句

INNER JOIN 与“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。这是搞清楚这类东西的一个很棒的工具。

于 2012-07-31T22:39:26.670 回答
-3
var result = from a in DB.classA
from b in DB.classB
where a.id.Equals(b.id)
select new{a.b};
于 2013-12-18T21:25:29.950 回答