Фильтр EntityFramework с переводами - PullRequest
0 голосов
/ 27 января 2020

Я изменяю 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%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...