【问题标题】:Starting select after specific value在特定值之后开始选择
【发布时间】:2020-05-10 23:02:41
【问题描述】:

这是我的问题。我正在尝试在特定记录之后选择记录列表,因此从这个值开始我想选择下一个(而不是起始值)。 我的“过滤器”是一个主键,类似于“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;

所以我将在 NP-A6666 之后获得 listVU 作为 50 个值的列表(从 NP-A6667 到 NP-A6717 为 UpdateDate 排序)。

【问题讨论】:

    标签: c# sql entity-framework linq tsql


    【解决方案1】:

    使用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();
    

    Skipwhile 按顺序运行可枚举,跳过谓词返回 true 的元素 - 一旦谓词返回 false,在这种情况下,当 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 停止的行,只需在 SkipWhile(p => !p.VuId.Equals("NP-A6666")) 之后执行 .Skip(1)

    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();
    

    【讨论】:

    • .SkipWhile 似乎非常适合我的范围,但我每次使用它时都会收到错误 500 内部服务器。另外,如果我只使用 .Skip(1) 我会得到同样的错误。
    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多