Лучший способ проверить, действителен ли список идентификаторов (EF Core) - PullRequest
0 голосов
/ 08 мая 2018

У меня есть список элементов флажков на html-странице, все из которых можно выбрать и с разными идентификаторами, и их идентификаторы отправляются через HTTP POST в мой API. В целях безопасности мне нужно проверить, является ли какой-либо из отправленных идентификаторов недействительным. Это просто метод, который возвращает false, если какой-либо из этих идентификаторов не существует в моей базе данных, и возвращает true, если все они существуют.

Сначала это выглядело легко, но я не нашел способа вернуть этот результат из моей базы данных напрямую, используя EF Core. Мне всегда нужно сравнивать Count моего результата запроса с моим списком Count.

Мой лучший подход был:

public async Task<bool> IsIdListValid(IEnumerable<int> idList) =>
   (await _context.Foo
              .Select(x => x.Id)
              .CountAsync(id => idList.Contains(id))
   ) == idList.Distinct().Count();

Итак, я спрашиваю: есть лучший способ написать этот запрос, более читаемый и производительный?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вместо проверки по количеству, вы можете реализовать свой вопрос напрямую:

public async Task<bool> IsIdListValid(IEnumerable<int> idList) =>
    idList.Any(id => !_context.Foo.Any(f => f.id == id));

Это отправит SQL-запрос для каждого члена idList, когда он действителен. Если idList короткий, это может быть хорошо, в противном случае ваш запрос Count, вероятно, лучше, хотя Select не требуется. Однако это будет ярлык, если idList содержит недопустимый элемент, останавливаясь на первом недопустимом элементе.

Другая возможность - использовать расширение EntityFrameworkCore.MemoryJoin , которое добавляет возможность отправлять список в памяти с использованием SQL VALUES, а затем присоединяться к нему.

0 голосов
/ 08 мая 2018

То, что вы ищете, это All:

public async Task<bool> IsIdListValid(IEnumerable<int> idList)  
{
   var validIds = await _context.Foo.Select(x => x.Id).ToListAync();
   return idList.All(x => validIds.Contains(x));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...