3

MongoDBSドキュメントのコレクションがあります。それぞれSにのコレクションがありUserPermission objects、それぞれにUserIdプロパティがあります。特定Sのを含むすべてのドキュメントを選択したい:UserPermissionUserId

return collection.Where(s => s.UserPermissions.Any(up => up.UserId == userIdString)).ToList();

.Any述語付きはサポートされていないというエラーが表示されます。MongoDBのドキュメントによると、「通常、プロジェクションの前に同等のwhere句を配置することで、このようなクエリを書き直すことができます(この場合、プロジェクションを削除できます)。」

どういう意味ですか?この制限を回避するためにクエリを変更する方法はありますか?

これが完全な例です。2つの異なるクエリを試しましたが、どちらもサポートされていないことがわかります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;

namespace MongoSample
{
    class Program
    {
        static void Main(string[] args)
        {
            App app1 = new App() { Name = "App1", Users = new List<User>() 
                { 
                    new User() { UserName = "Chris" } } 
                };

            App app2 = new App() { Name = "App2", Users = new List<User>() 
                { 
                    new User() { UserName = "Chris" }, 
                    new User() { UserName = "Carlos" } } 
                };

            MongoServer server = MongoServer.Create();
            MongoDatabase database = server.GetDatabase("test");
            MongoCollection appCollection = database.GetCollection("app");

            appCollection.Insert(app1);
            appCollection.Insert(app2);

            // Throws "Any with a predicate not supported" error
            //var query = appCollection.AsQueryable<App>()
            //    .Where(a => a.Users.Any(u => u.UserName == "Carlos"));

            // Throws "Unsupported Where Clause" error.
            var query = appCollection.AsQueryable<App>()
                .Where(a => a.Users.Where(u => u.UserName == "Carlos").Any());

            foreach (App loadedApp in query)
            {
                Console.WriteLine(loadedApp.ToJson());
            }
            Console.ReadLine();
        }
    }

    class App
    {
        public string Name { get; set; }
        public List<User> Users { get; set; }
    }

    class User
    {
        public string UserName { get; set; }
    }
}
4

1 に答える 1

3

Any()述語なしがサポートされているため、次のことができます。

collection.Where(s => s.UserPermissions
    .Where(up => up.UserId == userIdString).Any() )

(これは、の前に置かれた「同等の where 句」ですAny)

于 2012-05-29T07:33:25.697 に答える