Начало выбора после указания значения c - PullRequest
1 голос
/ 24 января 2020

вот моя проблема. Я пытаюсь выбрать список записей после указанного c, поэтому, начиная с этого значения, я хочу выбрать следующий (а не начальное значение). Мой «фильтр» - это первичный ключ, что-то вроде «NP-A6666».

Вот мой код:

var listVU = _context.AVu
 .OrderByDescending(r => r.UpdateDate)
 .Select(x => new AVut
 {
     VuId = x.VuId
 })
 .Take(50)
 .AsNoTracking()
 .ToListAsync();

return await listVU;

Я бы сделал что-то вроде:

var listVU = _context.AVu
 .OrderByDescending(r => r.UpdateDate)
 ".StartingFromButExluding(p => p.VuId == "NP-A6666")"
 .Select(x => new AVut
 {
     VuId = x.VuId
 })
 .Take(50)
 .AsNoTracking()
 .ToListAsync();

return await listVU;

Так что я получу listVU в виде списка из 50 значений сразу после NP-A6666 (от NP-A6667 до NP-A6717, заказанного для UpdateDate).

1 Ответ

2 голосов
/ 24 января 2020

Использование SkipWhile

var listVU = _context.AVu
                 .OrderByDescending(r => r.UpdateDate)
                 .SkipWhile(p => !p.VuId.Equals("NP-A6666"))
                 .Select(x => new AVut
                 {
                     VuId = x.VuId
                 })
                 .Take(50)
                 .AsNoTracking()
                 .ToListAsync();

Пропуск проходит последовательно через перечислимые пропускающие элементы, где предикат возвращает истину - когда предикат возвращает ложь, в этом случае, когда VuID = "NP -A6666 ", остальные элементы возвращаются как новые перечисляемые.

Если вы хотите получить все до VuID.Equals("NP-A6717"), вы можете сделать то же самое с TakeWhile вместо Take(50):

var listVU = _context.AVu
                 .OrderByDescending(r => r.UpdateDate)
                 .SkipWhile(p => !p.VuId.Equals("NP-A6666"))
                 .Select(x => new AVut
                 {
                     VuId = x.VuId
                 })
                 .TakeWhile(p => !p.Equals("NP-A6717"))
                 .AsNoTracking()
                 .ToListAsync();

И если вы хотите чтобы исключить строку, на которой останавливается SkipWhile, просто сделайте .Skip(1) сразу после SkipWhile(p => !p.VuId.Equals("NP-A6666"))

var listVU = _context.AVu
                 .OrderByDescending(r => r.UpdateDate)
                 .SkipWhile(p => !p.VuId.Equals("NP-A6666"))
                 .Skip(1)
                 .Select(x => new AVut
                 {
                     VuId = x.VuId
                 })
                 .Take(50)
                 .AsNoTracking()
                 .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...