C# 如何将此不受支持的LINQ查询转换为其本机Mongo等效查询?

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

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

您应该能够将
.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支持。我的其他尝试似乎也失败了:(