Информация об изменениях

Сообщение Linq2Sql не соединяет таблицы от 18.04.2017 1:13

Изменено 18.04.2017 1:14 Artem Korneev

Linq2Sql не соединяет таблицы
Достаю данные из базы с помощью Linq2Sql. В одном месте оно в упор не хочет делать JOIN таблиц, вместо этого берёт данные из второй таблицы построчно, генерируя десятки запросов.

Схема выглядит так:



Для всего этого есть .dbml mapping, загружаю из базы таким образом (здесь слегка упрощённый кусок, скопированный из LinqPad):

Поле 'Type' является первичным ключом в таблице SSUnitDefinition и две другие таблицы имеют внешние ключи, указывающие на это поле: в SSUnitMapping поле Type, а в SSUnitConversionFactor поля FromType и ToType.
Кроме того, в таблицах SSUnitConversionFactor и SSUnitMapping есть композитные ключи, состоящие из полей "FromType, ToType" и "Type, Value" соответственно.

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<SSUnitDefinition>(u => u.SSUnitMappings);
loadOptions.LoadWith<SSUnitDefinition>(u => u.SSUnitConversionFactors);
this.LoadOptions = loadOptions;

var foo = from definition in SSUnitDefinitions select definition;

foreach (var i in foo)
{
    foreach (var j in i.SSUnitConversionFactors)
    {
        Console.WriteLine(j.ConversionFactor);
    }
}


Вот это вот всё выливается в один такой запрос:

SELECT [t0].[Type], [t0].[Value], [t0].[DisplayValue], [t0].[FactoryDefined], [t1].[FromType], [t1].[ToType], [t1].[ConversionFactor], (
    SELECT COUNT(*)
    FROM [dbo].[SSUnitConversionFactors] AS [t2]
    WHERE [t2].[FromType] = [t0].[Type]
    ) AS [value2]
FROM [dbo].[SSUnitDefinition] AS [t0]
LEFT OUTER JOIN [dbo].[SSUnitConversionFactors] AS [t1] ON [t1].[FromType] = [t0].[Type]
ORDER BY [t0].[Type], [t1].[ToType]
GO


И ещё 50 запросов вроде вот этого:

-- Region Parameters
DECLARE @x1 Int = 0
-- EndRegion
SELECT [t0].[Type], [t0].[Value], [t0].[FactoryDefined]
FROM [dbo].[SSUnitMapping] AS [t0]
WHERE [t0].[Type] = @x1
GO

-- Region Parameters
DECLARE @x1 Int = 1
-- EndRegion
SELECT [t0].[Type], [t0].[Value], [t0].[FactoryDefined]
FROM [dbo].[SSUnitMapping] AS [t0]
WHERE [t0].[Type] = @x1
GO


Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос? Подскажите, если кто сталкивался. Весь интернет уже прочитал. Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.
Linq2Sql не соединяет таблицы
Достаю данные из базы с помощью Linq2Sql. В одном месте оно в упор не хочет делать JOIN таблиц, вместо этого берёт данные из второй таблицы построчно, генерируя десятки запросов.

Схема выглядит так:



Поле 'Type' является первичным ключом в таблице SSUnitDefinition и две другие таблицы имеют внешние ключи, указывающие на это поле: в SSUnitMapping поле Type, а в SSUnitConversionFactor поля FromType и ToType.
Кроме того, в таблицах SSUnitConversionFactor и SSUnitMapping есть композитные ключи, состоящие из полей "FromType, ToType" и "Type, Value" соответственно.

Для всего этого есть .dbml mapping, загружаю из базы таким образом (здесь слегка упрощённый кусок, скопированный из LinqPad):

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<SSUnitDefinition>(u => u.SSUnitMappings);
loadOptions.LoadWith<SSUnitDefinition>(u => u.SSUnitConversionFactors);
this.LoadOptions = loadOptions;

var foo = from definition in SSUnitDefinitions select definition;

foreach (var i in foo)
{
    foreach (var j in i.SSUnitConversionFactors)
    {
        Console.WriteLine(j.ConversionFactor);
    }
}


Вот это вот всё выливается в один такой запрос:

SELECT [t0].[Type], [t0].[Value], [t0].[DisplayValue], [t0].[FactoryDefined], [t1].[FromType], [t1].[ToType], [t1].[ConversionFactor], (
    SELECT COUNT(*)
    FROM [dbo].[SSUnitConversionFactors] AS [t2]
    WHERE [t2].[FromType] = [t0].[Type]
    ) AS [value2]
FROM [dbo].[SSUnitDefinition] AS [t0]
LEFT OUTER JOIN [dbo].[SSUnitConversionFactors] AS [t1] ON [t1].[FromType] = [t0].[Type]
ORDER BY [t0].[Type], [t1].[ToType]
GO


И ещё 50 запросов вроде вот этого:

-- Region Parameters
DECLARE @x1 Int = 0
-- EndRegion
SELECT [t0].[Type], [t0].[Value], [t0].[FactoryDefined]
FROM [dbo].[SSUnitMapping] AS [t0]
WHERE [t0].[Type] = @x1
GO

-- Region Parameters
DECLARE @x1 Int = 1
-- EndRegion
SELECT [t0].[Type], [t0].[Value], [t0].[FactoryDefined]
FROM [dbo].[SSUnitMapping] AS [t0]
WHERE [t0].[Type] = @x1
GO


Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос? Подскажите, если кто сталкивался. Весь интернет уже прочитал. Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.