Dynami c Запрос на основе всех дополнительных параметров с использованием условия OR в ядре ef - PullRequest
1 голос
/ 19 июня 2020

Я не уверен, что я лаю не на то дерево, но я хотел создать функцию, чтобы проверить, существует ли учетная запись на основе всех дополнительных параметров, чтобы ее можно было использовать для получения данных в зависимости от того, что вы хотите для проверки.

В основном запрос должен быть таким: где loginName = p1 или loginName = p2 или loginName = p3, но все параметры являются необязательными, однако по крайней мере один будет предоставлен.

Это то, что я пробовал до сих пор:

 public async Task<bool> CheckAccountExistsAsync(string loginName = "", string authenticatorId = "", string eId = "")
    {
      if (string.IsNullOrWhiteSpace(loginName) && string.IsNullOrWhiteSpace(authenticatorId) && string.IsNullOrWhiteSpace(eId))
        throw new InvalidOperationException("You must pass at least one parameter");

      return await _context.Accounts.AnyAsync(a =>
          (string.IsNullOrWhiteSpace(loginName) || a.LoginName == loginName)
          || (string.IsNullOrWhiteSpace(authenticatorId) || a.AuthenticatorId == authenticatorId)
          || (string.IsNullOrWhiteSpace(eId) || a.EmployeeId == eId));
    }

Проблема с этим подходом заключается в том, что если я просто передаю имя входа, то запрос будет выглядеть следующим образом с полностью опущенным условием:

      SELECT CASE
          WHEN EXISTS (
              SELECT 1
              FROM [Accounts] AS [a]) THEN CAST(1 AS bit)
          ELSE CAST(0 AS bit)
      END

Я уверен, что что-то упускаю, есть ли лучший подход?

1 Ответ

2 голосов
/ 19 июня 2020

То, что вы используете, применимо для необязательных выражений and, например

return await _context.Accounts.AnyAsync(a =>
    (string.IsNullOrWhiteSpace(loginName) || a.LoginName == loginName)
    && (string.IsNullOrWhiteSpace(authenticatorId) || a.AuthenticatorId == authenticatorId)
    && (string.IsNullOrWhiteSpace(eId) || a.EmployeeId == eId));

Для необязательных or вы должны использовать необязательные подусловия and и добавить дополнительную проверку на отсутствие всех необязательных параметров , например,

return await _context.Accounts.AnyAsync(a =>
    (string.IsNullOrWhiteSpace(loginName)
    && string.IsNullOrWhiteSpace(authenticatorId)
    && string.IsNullOrWhiteSpace(eId))
    || (!string.IsNullOrWhiteSpace(loginName) && a.LoginName == loginName)
    || (!string.IsNullOrWhiteSpace(authenticatorId) && a.AuthenticatorId == authenticatorId)
    || (!string.IsNullOrWhiteSpace(eId) && a.EmployeeId == eId));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...