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

时间:2013-01-21 22:53:02

标签: c# mongodb linq nosql

我有这个链式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支持的本机查询?

2 个答案:

答案 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支持什么(抱歉,我只是从的角度来回答这个问题),但您也可以使用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();