【发布时间】:2012-12-13 13:15:47
【问题描述】:
我有一个问题:
var contactInfos = from person in persons
join tempDesiredCar in desiredCars on person.contact_id equals tempDesiredCar.groupEntity_id
into tempDesiredCars
from desiredCar in tempDesiredCars.DefaultIfEmpty()
select new {name = person.name, car = desiredCar.name};
此代码转换为 SQL:
SELECT [t1].[name], [t19].[name] AS [car]
FROM [dbo].[Person] AS [t1]
CROSS APPLY ((
SELECT NULL AS [EMPTY]
) AS [t6]
OUTER APPLY (
SELECT [t18].[name]
FROM (
SELECT [t17].[contact_id], [t17].[name]
FROM (
SELECT [t7].[contact_id], [t11].[name]
FROM [dbo].[DesiredCar] AS [t7]
INNER JOIN (
SELECT MAX([t9].[value]) AS [value]
FROM (
SELECT [t8].[id] AS [value], [t8].[contact_id]
FROM [dbo].[DesiredCar] AS [t8]
) AS [t9]
GROUP BY [t9].[contact_id]
) AS [t10] ON ([t7].[id]) = [t10].[value]
LEFT OUTER JOIN [dbo].[FamilyModel] AS [t11] ON [t11].[id] = [t7].[model]
WHERE [t7].[model] IS NOT NULL
UNION
SELECT [t12].[contact_id], [t16].[name]
FROM [dbo].[DesiredCar] AS [t12]
INNER JOIN (
SELECT MAX([t14].[value]) AS [value]
FROM (
SELECT [t13].[id] AS [value], [t13].[contact_id]
FROM [dbo].[DesiredCar] AS [t13]
) AS [t14]
GROUP BY [t14].[contact_id]
) AS [t15] ON ([t12].[id]) = [t15].[value]
LEFT OUTER JOIN [dbo].[CarBrand] AS [t16] ON [t16].[id] = [t12].[carBrand_id]
WHERE [t12].[carBrand_id] IS NOT NULL
) AS [t17]
) AS [t18]
where [t1].[contact_id] = [t18].[contact_id]
) AS [t19])
该代码使用应用。如果 replace Apply by Left Join 代码会在几次内运行 faster。 如何强制 Linq 使用 Left Join 生成代码?
【问题讨论】:
-
LINQ to SQL 不是编写 SQL 的“更好”方式,也不是替代 SQL。手动编写这样一个简单的语句并让 L2S 从结果中创建新对象更加容易和快捷
-
这个解决方案使得自动重构不可用。
-
请向我们展示完整的 LINQ 查询...
-
另外请张贴图形执行计划。我看不出为什么 APPLY 应该在此处产生不同的查询计划的原因。你确定到
LEFT JOIN的转换在语义上是相同的吗? -
计划与 Apply yadi.sk/d/w9SAcsiu1VDKU
标签: linq linq-to-sql outer-join cross-apply performance