使用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
结合起来上面的语法。
我知道两种语法查询都返回相同的数据,但我想知道是否存在性能差异或其他类型的差异,这将最终支持一种语法而不是另一种语法。
感谢您的建议。
答案 0 :(得分:17)
这两个问题实际上回答得很好。
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};