可以使用mongo linq进行基于范围的分页,或者我最好使用filter
路线。以下是我的案例:
我将Id存储并生成为mongo ObjectId
s,但在我的域中将它们视为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();
如果你想进行字符串比较,比较'string1> string2'将用C#String.Compare(string1, string2) == 1
编写。
然而,阅读the docs on C# driver,似乎mongodb的Linq适配器还没有翻译它,所以.Where(m => String.Compare(m.Id, afterId) == 1)
很可能被忽略/失败。 (编辑:根据您的评论,它会给出错误消息)
作为替代方案,您可以:
Take
和Skip
来调整大小的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();