Сообщение Linq2Sql не соединяет таблицы от 18.04.2017 1:13
Изменено 18.04.2017 1:13 Artem Korneev
Linq2Sql не соединяет таблицы
Достаю данные из базы с помощью Linq2Sql. В одном месте оно в упор не хочет делать JOIN таблиц, вместо этого берёт данные из второй таблицы построчно, генерируя десятки запросов.
Схема выглядит так:
Для всего этого есть .dbml mapping, загружаю из базы таким образом (здесь слегка упрощённый кусок, скопированный из LinqPad):
Поле 'Type' является первичным ключом в таблице SSUnitDefinition и две другие таблицы имеют внешние ключи, указывающие на это поле: в SSUnitMapping поле Type, а в SSUnitConversionFactor поля FromType и ToType.
Кроме того, в таблицах SSUnitConversionFactor и SSUnitMapping есть композитные ключи, состоящие из полей "FromType, ToType" и "Type, Value" соответственно.
Вот это вот всё выливается в один такой запрос:
И ещё 50 запросов вроде вот этого:
Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос? Подскажите, если кто сталкивался. Весь интернет уже прочитал. Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.
Схема выглядит так:
Для всего этого есть .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 таблиц, вместо этого берёт данные из второй таблицы построчно, генерируя десятки запросов.
Схема выглядит так:
Для всего этого есть .dbml mapping, загружаю из базы таким образом (здесь слегка упрощённый кусок, скопированный из LinqPad):
Поле 'Type' является первичным ключом в таблице SSUnitDefinition и две другие таблицы имеют внешние ключи, указывающие на это поле: в SSUnitMapping поле Type, а в SSUnitConversionFactor поля FromType и ToType.
Кроме того, в таблицах SSUnitConversionFactor и SSUnitMapping есть композитные ключи, состоящие из полей "FromType, ToType" и "Type, Value" соответственно.
Вот это вот всё выливается в один такой запрос:
И ещё 50 запросов вроде вот этого:
Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос? Подскажите, если кто сталкивался. Весь интернет уже прочитал. Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.
Схема выглядит так:
Для всего этого есть .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
Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос? Подскажите, если кто сталкивался. Весь интернет уже прочитал. Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.