关于c#:linq-to-sql使用多个from子句语法与传统连接语法进行连接

linq-to-sql joins with multiple from clauses syntax vs. traditional join syntax

像这样使用2个from子句和where编写联接之间的区别是什么:

1
2
3
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组合在一起。

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

感谢您的建议。


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

INNER JOIN ON与WHERE子句

INNER JOIN与" FROM"中的多个表名称

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

隐式联接:

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

将被翻译成

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

内部联接:

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

将被翻译成

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

左外连接:

1
2
3
4
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 }

将被翻译成

1
2
3
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
3
4
var result = from a in DB.classA
from b in DB.classB
where a.id.Equals(b.id)
select new{a.b};