1

我有这个 MongoDB 无法执行的链式 LINQ 查询:

RoleCollection.AsQueryable().Where(r => r.Users.Any(id => id == user.Id))
    .Select(r => r.Name).ToArray();

这会导致以下错误:

Any is only support for items that serialize into documents. The current serializer is ObjectIdSerializer and must implement IBsonDocumentSerializer for participation in Any queries. 

如何将查询转换为 Mongo 支持的本机查询?

4

2 回答 2

1

您应该能够用和 长度检查.Any()的组合替换,如下所示:.Where()

RoleCollection.AsQueryable().Where(r => r.Users.Where(id => id == user.Id).Length > 0)
    .Select(r => r.Name).ToArray();

但是请注意,这里存在性能影响,因为它会拉回所有用户以id对其进行长度处理。

我不确定 Mongo 支持什么(对不起,我纯粹从的角度回答这个问题),但您也可以使用组合FirstOrDefault并在您的位置执行null检查。这可能会更好,因为您只期待一个或什么都没有:

RoleCollection.AsQueryable().Where(r => r.Users.FirstOrDefault(id => id == user.Id) != null)
    .Select(r => r.Name).ToArray();
于 2013-01-21T22:59:09.150 回答
1

我得到了以下查询,尽管我还不完全确定它的语义:

RoleCollection.Find(new QueryDocument("Users", user.Id))
            .Select(r => r.Name).ToArray();
于 2013-01-21T23:40:58.540 回答