如何将这个不受支持的LINQ查询转换为其本地的Mongo等效查询?

本文关键字:查询 Mongo 转换 LINQ 支持 | 更新日期: 2023-09-27 17:54:52

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

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将支持的本机查询?

如何将这个不受支持的LINQ查询转换为其本地的Mongo等效查询?

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

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

请注意,这里有一个性能暗示,因为它将拉回所有的用户与id做一个长度。

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

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

我得到了下面的查询工作,虽然我还不完全确定它的语义:

RoleCollection.Find(new QueryDocument("Users", user.Id))
            .Select(r => r.Name).ToArray();