我有这个链式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支持的本机查询?
答案 0 :(得分:1)
您应该可以使用.Any()
和长度检查的组合替换.Where()
,如下所示:
RoleCollection.AsQueryable().Where(r => r.Users.Where(id => id == user.Id).Length > 0)
.Select(r => r.Name).ToArray();
但是请注意,这里存在性能影响,因为它会将{em>所有用户id
拉回来为它做一个长度。
我不确定Mongo支持什么(抱歉,我只是从linq的角度来回答这个问题),但您也可以使用FirstOrDefault
的组合并执行null
检查你的位置。这可能会更好,因为你只是期待一个或者什么都没有:
RoleCollection.AsQueryable().Where(r => r.Users.FirstOrDefault(id => id == user.Id) != null)
.Select(r => r.Name).ToArray();
答案 1 :(得分:1)
我得到了以下查询,但我还不完全确定它的语义:
RoleCollection.Find(new QueryDocument("Users", user.Id))
.Select(r => r.Name).ToArray();