我有这个链接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将支持的本机查询?
您应该能够将.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();