【发布时间】:2018-02-28 07:56:34
【问题描述】:
可以使用 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();
【问题讨论】:
-
注意:如果您想知道某个对象是否在 另一个对象之后生成,您应该不 依赖 objectId 为“更大”(在字典顺序)比另一个。请参阅:stackoverflow.com/questions/31057827/…
-
现在,关于您的确切问题,在 C# 中查看一个字符串是否比另一个“更大”,您可以使用 String.Compare 。
String.Compare(a, b)如果 a 小于 b,则为 -1,如果相等,则为 0,如果 a 大于 b,则为 1。 -
嗨@Pac0 感谢 cmets。我不太关心哪个对象是在哪个对象之后生成的,只要它们不会影响我的分页。我主要关心的只是
deep不重复地翻阅结果。 -
我认为字符串比较不会用 linq 处理(尽管您可以尝试:
.Where(m => String.Compare(m.Id, afterId) > 1))。要进行范围分页,我没有解决方案。不过,支持 linqTake和Skip,因此您可以进行一些基于大小的分页。但这似乎不是你想要的。 -
如果可以选择,您可以在文档中添加另一个字段数字 id,然后您的第一个查询就可以工作