В SQL, сгенерированном Entity Framework, отсутствует соединение - PullRequest
0 голосов
/ 01 ноября 2018

Мы заметили, что этот запрос имеет большое количество запросов:

var var1 = "535d1a11-1c2b-467a-3333-222aaa9b1fd4";
var var2 = 117;
var test = (from t1 in contextObj.Table1
    join t2 in contextObj.Table2
        on t1.Column2 equals t2.Column1
    join t3 in contextObj.Table3 on t2.Column2 equals t3.Column1
    where t3.Column1 == var1 && t2.Column3 == var2
                             && t2.Column2 == var1
    select t1).ToList();

Это потому, что в SQL, сгенерированном Entity Framework, отсутствует соединение:

exec sp_executesql N'SELECT 
    [Extent1].[Column1] AS [Column1], 
    [Extent1].[Column2] AS [Column2], 
    [Extent1].[Column3] AS [Column3], 
    [Extent1].[Column4] AS [Column4], 
    [Extent1].[Column5] AS [Column5], 
    [Extent1].[Column6] AS [Column6]
    FROM  [dbo].[Table1] AS [Extent1]
    INNER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[Column2] = [Extent2].[Column1]
    WHERE ([Extent2].[Column2] = @p__linq__0) AND ([Extent2].[Column3] = @p__linq__1) AND ([Extent2].[Column2] = @p__linq__2)',N'@p__linq__0 nvarchar(4000),@p__linq__1 int,@p__linq__2 nvarchar(4000)',@p__linq__0=N'535d5b16-1c2b-467a-9022-933ebf9b1fd4',@p__linq__1=117,@p__linq__2=N'535d5b16-1c2b-467a-9022-933ebf9b1fd4'

Сценарий создания базы данных: https://gist.github.com/jbouwens/85e8840d799b8178ee30feb389fbc4ac

Почему EF не включил это соединение / что я могу сделать, чтобы предотвратить это в будущем? Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

В вашем запросе предложение where сравнивает t3.Column1 == var1 и t2.Column2 == var1, но поскольку ваше объединение уже учитывает, что t3.Column1 == t2.Column2, EF автоматически удаляет то, что оно предполагает ненужное соединение. Поскольку структура таблицы не идеальна, было решено вернуть столбец из table3, чтобы заставить EF присоединиться к таблице.

var test = (from t1 in contextObj.Table1new 
    join t2 in contextObj.Table2
        on t1.Column2 equals t2.Column1
    join t3 in contextObj.Table3 on t2.Column2 equals t3.Column1
    where t3.Column1 == var1 && t2.Column3 == var2
    select new { t1, t3.Column1 }).ToList()
0 голосов
/ 01 ноября 2018

Я сделал это повторно, и EF «доверяет» вашим объявленным внешним ключам при генерации запросов, что будет делать и SQL Server (если они будут принудительно применены и проверены).

EF преобразует предикат t3.Column1 == var1 в [Extent2].[Column3] = @p__linq__1, поскольку вы присоединили эти столбцы в запросе, а внешний ключ гарантирует, что объединение изменит количество строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...