Linq2Sql не соединяет таблицы
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 18.04.17 01:13
Оценка:
Достаю данные из базы с помощью 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


Т.е. одну таблицу он джойнит нормально, а для второй идёт закат Солнца вручную. Почему оно не хочет доставать данные в один запрос? Подскажите, если кто сталкивался. Весь интернет уже прочитал. Сижу, выдёргиваю перья из попугая, не знаю что ещё сделать.
С уважением, Artem Korneev.
Отредактировано 18.04.2017 1:14 Artem Korneev . Предыдущая версия . Еще …
Отредактировано 18.04.2017 1:13 Artem Korneev . Предыдущая версия .
Re: Linq2Sql не соединяет таблицы
От: hardcase Пират http://nemerle.org
Дата: 18.04.17 08:59
Оценка: +1
Здравствуйте, Artem Korneev, Вы писали:

AK>Достаю данные из базы с помощью Linq2Sql.


Рассметривается ли вариант закопать стюардессу и взять Linq2Db?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Linq2Sql не соединяет таблицы
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 18.04.17 18:20
Оценка: -1
Здравствуйте, hardcase, Вы писали:

AK>>Достаю данные из базы с помощью Linq2Sql.

H>Рассметривается ли вариант закопать стюардессу и взять Linq2Db?

Прощание со стюардессой рассматривается, но я думал о миграции на Entity Framework.
Но миграция займёт какое-то время. У меня релиз через месяц, в этом релизе что-то крупное менять уже некогда. Если получится, то выпилю linq2sql к следующему релизу. А пока нужно как-то поддерживать и допиливать то, что есть.
С уважением, Artem Korneev.
Re[2]: Linq2Sql не соединяет таблицы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.04.17 18:32
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Рассметривается ли вариант закопать стюардессу и взять Linq2Db?


У linq2db конкретно в этом плане есть пара очень неприятных проблем, связанных с group by. Регулярно об них ноги ломаю. Но там вроде бы можно это отрубить, чтобы вместо кучи запросов валилось исключение.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.