C# 如何将此不受支持的LINQ查询转换为其本机Mongo等效查询?
我有一个MongoDB无法执行的链接LINQ查询:C# 如何将此不受支持的LINQ查询转换为其本机Mongo等效查询?,c#,mongodb,linq,nosql,C#,Mongodb,Linq,Nosql,我有一个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 ObjectI
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支持什么(很抱歉,我只是从一个角度回答这个问题),但您也可以使用FirstOrDefault
的组合,并在where中执行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();
您是否使用MongoDB尝试过
FirstOrDefault
或Where
,RoleCollection.AsQueryable().Where(r=>r.Users.Where(id=>id==user.id.Count()>0)
或RoleCollection.AsQueryable().Where(r=>r.Users.FirstOrDefault(id=>id==user.id)!=null)
@sa\u ddam213它们也失败了。这是真的,但我想我还是学习原生Mongo查询吧,因为LINQ支持似乎太不完整了?@aknuds1抱歉,正如我(更新)的回答中提到的,我完全是从LINQ的角度来回答这个问题的。我没有与Mongo合作过,因此无法对其本机linq支持发表评论。举例来说,FirstOrDefault
在本例中不受Mongo支持。我的其他尝试似乎也失败了:(