Достаю данные из базы с помощью 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
Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос?
Подскажите, если кто сталкивался. Весь интернет уже прочитал.
Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.
Здравствуйте, hardcase, Вы писали:
H>Рассметривается ли вариант закопать стюардессу и взять Linq2Db?
У linq2db конкретно в этом плане есть пара очень неприятных проблем, связанных с group by. Регулярно об них ноги ломаю. Но там вроде бы можно это отрубить, чтобы вместо кучи запросов валилось исключение.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>