none
Linq To SQL. Как заставить LINQ использовать left join? RRS feed

  • Вопрос

  • Есть запрос:

    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])

    Код использует оператор Apply. Если заменить Apply на Left Join код выполняется в несколько раз быстрее. Как заставить Linq использовать left join?


    28 декабря 2012 г. 8:38

Все ответы

  • Есть подозрение, что вам значительно быстрее ответят в форуме по .NET, нежели в этом.

    www.sqlCMD.ru - all around MS SQL Server

    28 декабря 2012 г. 14:33
  • Если же думать про sql server и его поведение, то можно попытаться разобраться с тем, почему плохо работает apply на ваших данных. Запрос жутковат, конечно. Автогенерённый код такого рода часто работает грустно, но в немалой части ситуаций помочь оптимизатору можно. Данных в ваших табличках вряд ли гигантское количество, судя по их названиям и предполагаемой семантике, так что даже неидеальное улучшение ситуации может оказаться приемлемым.

    Вы можете показать скрипты создания таблиц, их ключей и индексов и те планы, который вы получаете для вариантов с left join и apply?


    7 января 2013 г. 19:40