Я изменяю NET Базовый проект, у которого нет общего репозитория c, и он тянет базу данных на SQL Сервер, а другую на PostgreSQL.
В обоих ddbb есть Есть много таблиц, и каждая таблица имеет свою собственную таблицу перевода (связанную с основной таблицей языка) для поиска терминов в базе данных.
Поля языковой таблицы:
[Id] [nvarchar](2) NOT NULL,
[LanguageKey] [nvarchar](2) NOT NULL,
[ISO639-2T] [nvarchar](3) NULL,
[ISO639-2B] [nvarchar](20) NULL
в postgre аналогично.
Пример полей таблицы перевода:
[Id] [int] IDENTITY(1,1) NOT NULL,
[FkCCAA] [int] NOT NULL, -- FK to related table
[FkTranslation] [nvarchar](2) NOT NULL, -- FK to language table
[Name] [nvarchar](300) NOT NULL
Как для поиска, так и для поиска имен, я должен сначала попытаться найти язык, который они спрашивают, а затем найти язык по умолчанию. один, который они также передают мне, и если не термин, который на каком-то языке.
В данный момент я делаю что-то в этом стиле, но мне кажется, немного оптимальным:
result = await _context.TableX.Where(x => (x.TableXTranslations.Where(t => t.FkTranslation == lang && !string.IsNullOrWhiteSpace(t.Name)).FirstOrDefault().Name ?? x.TableXTranslations.Where(t => t.FkTranslation == defLang && !string.IsNullOrWhiteSpace(t.Name)).FirstOrDefault().Name ?? x.TableXTranslations.Where(t => !string.IsNullOrWhiteSpace(t.Name)).FirstOrDefault().Name).ToLower().Contains(name.ToLower()))
.Select(x => new ItemDto
{
Id = x.Id.ToString(),
Name = x.TableX.Where(t => t.FkTranslation == lang && !string.IsNullOrWhiteSpace(t.Name)).FirstOrDefault().Name ?? x.TableX.Where(t => t.FkTranslation == defLang && !string.IsNullOrWhiteSpace(t.Name)).FirstOrDefault().Name ?? x.TableX.Where(t => !string.IsNullOrWhiteSpace(t.Name)).FirstOrDefault().Name
}).AsNoTracking().AsQueryable().ToListAsync();
Также согласно документации NET Core 3 этот запрос должен быть переведен JOINS, но вместо этого он переведен подзапросами, еще менее эффективными.
Я пытаюсь смонтировать обобщенный запрос c, который я могу использовать из где d Выбор каждого запроса в каждой таблице, что довольно много, но я не могу использовать generi c репозитории, и, если возможно, я также не могу использовать хранимые процедуры.
Может кто-нибудь придумать способ сделать это?
Спасибо большое !!
ОБНОВЛЕНИЕ
В случае, если вопрос проясняется, запрос, который я пытаюсь сделать ( и обобщить) с лямбда-выражениями в SQL было бы более или менее так:
SELECT TOP(1) X.*, COALESCE(Xtransl1.Name, Xtransl2.Name, Xtransl3.Name) Name
FROM [TablaX] X
LEFT JOIN [TablaX_TRANSLATION] Xtransl1
ON X.Id = Xtransl1.FkTablaX AND Xtransl1.FkTranslation = 'es' AND ISNULL(Xtransl1.Name, '') <> ''
LEFT JOIN [TablaX_TRANSLATION] Xtransl2
ON X.Id = Xtransl2.FkTablaX AND Xtransl2.FkTranslation = 'en' AND ISNULL(Xtransl2.Name, '') <> ''
LEFT JOIN [TablaX_TRANSLATION] Xtransl3
ON X.Id = Xtransl3.FkTablaX AND ISNULL(Xtransl3.Name, '') <> ''
WHERE
Xtransl1.Name like '%alm%'
OR
Xtransl2.Name like '%alm%'
OR
Xtransl3.Name like '%alm%'