基于mongodb范围的linq分页

问题描述 投票:1回答:1

可以使用mongo linq进行基于范围的分页,或者我最好使用filter路线。以下是我的案例:

我将Id存储并生成为mongo ObjectIds,但在我的域中将它们视为strings

    BsonIgnoreIfDefault]
    [BsonRepresentation(BsonType.ObjectId)]
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    public string Id { get; set; }

而我正在努力

var result = await _collection.AsQueryable()
         .Where(m => m.Id > afterId) // '>' illegal with strings
         .OrderBy(m => m.Id)
         .ToListAsync(); 

Error CS0019 Operator '>' cannot be applied to operands of type 'string' and 'string'

另外一个选项。我的Id是mongo生成的ObjectId,我在我的过滤器中比较它们:

var idFilter = Builders<T>.Filter.Gt(m => m.Id, afterId);
result = await _collection.Find(idFilter).ToListAsync();
c# mongodb linq
1个回答
1
投票

如果你想进行字符串比较,比较'string1> string2'将用C#String.Compare(string1, string2) == 1编写。

然而,阅读the docs on C# driver,似乎mongodb的Linq适配器还没有翻译它,所以.Where(m => String.Compare(m.Id, afterId) == 1)很可能被忽略/失败。 (编辑:根据您的评论,它会给出错误消息)

作为替代方案,您可以:

  • 添加一个不同的数字id字段(唯一和索引),以允许通过Linq进行排序(有点丑陋和矫枉过正,但可能是一种可能性)
  • 使用TakeSkip来调整大小的chunk而不是id范围,这些已经被支持了,就像这样:

/// take the results 2001-3000 in the list ordered by id.
var result = await _collection.AsQueryable()
     .OrderBy(m => m.Id)
     .Skip(2000)
     .Take(1000)
     .ToListAsync(); 
© www.soinside.com 2019 - 2024. All rights reserved.