基于mongo范围的linq分页

时间:2018-02-28 07:56:35

标签: c# mongodb linq

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

1 个答案:

答案 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进行排序(有点丑陋和矫枉过正,但可能有可能)

  • 按大小的块分页,而不是TakeSkip的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();