可以使用mongo linq进行基于范围的分页,或者使用filter
路线更好。以下是我的案例:
我将Id' s存储并生成为mongo ObjectId
,但在我的域中将其视为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();
答案 0 :(得分:1)
如果你想进行字符串比较,比较'string1&gt; string2'将用C#String.Compare(string1, string2) == 1
编写。
但是,阅读the docs on C# driver,似乎mongodb的Linq适配器尚未对此进行转换,因此.Where(m => String.Compare(m.Id, afterId) == 1)
可能会被忽略/失败。 (编辑:根据您的评论,它会给出错误消息)
作为替代方案,您可以:
添加一个不同的数字id字段(唯一且索引)以允许通过Linq进行排序(有点丑陋和矫枉过正,但可能有可能)
按大小的块分页,而不是Take
和Skip
的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();