Сравните два массива в запросе LINQ - PullRequest
0 голосов
/ 23 декабря 2018

Я хочу написать запрос LINQ для сравнения двух массивов.Я хочу, чтобы запрос был переведен на следующий запрос:

SELECT id, name 
FROM persons 
WHERE '{"dance", "acting", "games"}' && (hobbies);

Это условие работает следующим образом:

 '{"dance"}' && '{"dance", "acting", "games"}';  -- true
 '{"dance","singins"}' && '{"dance", "acting", "games"}';  -- true
 '{"singins"}' && '{"dance", "acting", "games"}';  -- false

Я написал этот запрос:

List<string> arr = new List<string>(){ "dance", "acting", "games" };
var query = (from p in _context.Persons
             where arr.Any(kw => p.hobbies.Contains(kw))
             select new
                  {
                      id = p.id,
                      name = p.name
                  }).ToList();

Переведенный запрос:

SELECT p."id" AS id, p."name" AS name 
FROM dataBase."Persons" AS p

Он может понять, что фильтр работает на сервере.поэтому запрос приносит все данные из БД и фильтруется на сервере.Это вызывает проблемы с производительностью и не проходит нагрузочное тестирование.

Мне нужен запрос, который не только выполнит работу, но и будет переведен на вышеуказанный запрос с помощью & &&.

Есть ли способ в LINQ выполнить этот запрос?

Спасибо

1 Ответ

0 голосов
/ 23 декабря 2018

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

List<string> arr = new List<string>(){ "dance", "acting", "games" };

var matches = from hobby_person in _context.Hobbies_Persons
join person in _context.Persons on person.Id equals hobby_person.PersonId
join hobby in _context.Hobbies on hobby.Id equals hobby_person.HobbyId
where arr.Contains(hobby.Name) 
         select new
              {
                  id = p.id,
                  name = p.name
              }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...