Как считать из БД по LINQ и где - PullRequest
0 голосов
/ 17 июня 2019

У меня проблема. Я хочу сделать свое заявление быстрее. Моя проблема:

_context.Products.Where(m => m.Name.Contains(part)).Take(20);

Я не хочу брать всю коллекцию, я хочу взять только ее часть. Я хочу брать элементы, пока у меня не будет достаточно элементов, которые удовлетворяют моим условиям, и я не просматриваю всю свою коллекцию, чтобы получить мой результат. Могу ли я получить это с помощью стандартных методов LINQ и EF Core?

Ответы [ 2 ]

1 голос
/ 19 июня 2019

В основном да. До тех пор, пока вы не вызовете метод ToList или не начнете выполнять итерации в этой коллекции, все методы LINQ и EF преобразуются в SQL. Он работает немного как построитель запросов, итерация является триггером для выполнения запроса в этом случае. Пожалуйста, прочитайте об интерфейсе IQueryable.

Например, приведенный выше код будет преобразован в «ВЫБЕРИТЕ ТОП 20 * ИЗ ПРОДУКТОВ ГДЕ»

0 голосов
/ 17 июня 2019

Ниже мой ответ основан на предположении, что вы хотите получать данные порциями, а не собирать всю коллекцию за один раз, чтобы ваше приложение работало быстрее.

«Я не хочу брать всю коллекцию, я хочу принимать только участие об этом. "

Вы должны играть с обоими методами Пропустить и Взять.

Например, вы можете принять статический размер страницы, например 20 в вашем случае. И затем при запросе результатов вам нужно указать индекс страницы, по которой вы хотите получить данные. Чтобы узнать, сколько страниц соответствует вашему запросу, вы можете сначала посчитать количество записей и сохранить их где-нибудь на стороне клиента / в памяти / кэше.

return _context.Products.Where(m => m.Name.Contains(part)).Count(); // to get the total number of records e.g. 74

Затем, чтобы получить порцию данных, вы указываете размер страницы и индекс страницы.

_context.Products.Where(m => m.Name.Contains(part)).Skip(PAGE_INDEX*PAGE_SIZE).Take(PAGE_SIZE);

PAGE_INDEX и PAGE_SIZE являются входными параметрами для вашей функции.

...