Linq to entity: объединить строку и int без преобразования - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть 2 таблицы: в одной таблице есть столбец nvarchar следующего формата: «Тип | Id (или GUID)».Если тип столбца - «Таблица2», а вторая часть - целочисленная, то в таблице указывается первичный ключ, на который ссылается первая таблица.

Итак, моя первая попытка присоединиться к столам была:

    var query = from t1 in db.Table1
            join t2 in db.Table2
                on t1.TypeAndId equals "Table1|" + t2.Id
            select t2;

Однако выполнение заняло бы целую вечность.При проверке запроса в профилировщике он генерирует что-то вроде:

    SELECT 
            [Extent2].[Id] AS [Id]
            FROM  [dbo].[Table1] AS [Extent1]
            INNER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[TypeAndId] = (N'Type|' +  CAST( [Extent2].[Id] AS nvarchar(max)))
            WHERE [Extent1].[Id] = @p__linq__0

Наш администратор БД предложил что-то вроде:

    SELECT
           [Extent2].[Id] AS [Id]
           FROM  [dbo].[Table1] AS [Extent1]
           INNER JOIN [dbo].[Table2] AS [Extent2] ON replace([Extent1].[TypeAndId],'Type|','') =  [Extent2].[Id]
           WHERE [Extent1].[Id] = 519

Похоже, очевидным решением будет:

    var query = from t1 in db.Table1
            join t2 in db.Table2
                on t1.TypeAndId.Replace("Table1|", "") equals t2.Id
            select t2;

Однако это не скомпилируется, поскольку один столбец nvarchar, другой - int.Поэтому мне интересно, как я могу сделать соединение, которое сгенерирует запрос, который был предложен нашим администратором базы данных

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