3

私はRavenDBを初めて使用し、ここで条件が発生します。基本的に、これを達成したいのですが、RavenDBに従業員のリストがあり、「契約」タイプではない従業員を取得する必要があります。基本的な統合言語クエリを使用しようとしましたが、「メソッドがサポートされていません」や「翻訳方法がわかりません...など」などの例外が発生するため、問題を解決できません。

これは私が今まで試したことです。

   class Program
    {
        static void Main(string[] args)
        {
            using (var documentStore = new DocumentStore() { ConnectionStringName = "RavenDBConnectionString" })
            {
                documentStore.Initialize();
                /* using (var session = documentStore.OpenSession())
                {
                    session.Store(new User { Id = 1, Roles = new List<Role> { new Role { Type = UserType.Contract }, new Role { Type = UserType.Developer } } });
                    session.Store(new User { Id = 2, Roles = new List<Role> { new Role { Type = UserType.Permanent }, new Role { Type = UserType.Developer } } });
                    session.Store(new User { Id = 3, Roles = new List<Role> { new Role { Type = UserType.SeniorDeveloper }, new Role { Type = UserType.Manager } } });
                    session.Store(new User { Id = 4, Roles = new List<Role> { new Role { Type = UserType.Contract }, new Role { Type = UserType.SeniorDeveloper } } });
                    session.Store(new User { Id = 5, Roles = new List<Role> { new Role { Type = UserType.Permanent }, new Role { Type = UserType.Manager } } });
                    session.Store(new User { Id = 6, Roles = new List<Role> { new Role { Type = UserType.Contract }, new Role { Type = UserType.Developer } } });
                    session.SaveChanges();
                }*/

                using (var session = documentStore.OpenSession())
                {

                    //var nonContractEmployees = session.Query<User>().Where(x => !x.Roles.Exists(y => y.Type == UserType.Contract)).ToList();
                     var nonContractEmployees = session.Query<User>().Where(x => x.Roles.Count(y => y.Type == UserType.Contract) == 0).ToList();
                    // var nonContractEmployees = session.Query<User>().Where(x => !x.Roles.Contains(x.Roles.FirstOrDefault(y => y.Type == UserType.Contract))).ToList();
                    //var nonContractEmployees = session.Query<User>().Where(x => x.Roles.FirstOrDefault(y => y.Type == UserType.Contract) == null).ToList();
                }
            }
        }
    }

    public class User
    {
        public int Id { get; set; }
        public List<Role> Roles { get; set; }
    }

    public class Role
    {
        public UserType Type { get; set; }
    }

    public enum UserType
    {
        Manager,
        Permanent,
        Contract,
        Developer,
        SeniorDeveloper
    }

誰かがこの問題を解決するのを手伝ってくれるなら、私は本当にそれを感謝します。

ありがとう、
カピル

4

2 に答える 2

0

試す:

var nonContractEmployees = session.Query<User>()
    .Where(x => !x.Roles.Any(y => y.Type == UserType.Contract))
    .ToList();

クエリを更新しました。(現在失敗しています)

そして、私はGoogleグループでのあなたの質問に対してAyendeに不合格のテストを提出しました。

https://groups.google.com/forum/?fromgroups#!topic/ravendb/LpSo3VdkavI

于 2012-06-11T06:56:53.927 に答える
0

編集1

var nonContractEmployees = session.Query<User>()
    .Where(x => !x.Roles.In(new [] {new Role { Type = UserType.Contract}))
    .ToList();

編集2

これは機能しますが、効率的ではありません。

using (var session = documentStore.OpenSession())
{
    var nonContractEmployees = session.Query<User>()
        .ToList()
        .Where(x => x.Roles.Contains(
            new Role {Type = UserType.Contract},
            new RoleComparer()));                        
}

public class RoleComparer : IEqualityComparer<Role>
{
    public bool Equals(Role x, Role y)
    {
        return
            x == null && y == null ||
            x != null &&
            y != null &&
            x.Type == y.Type;
    }

    public int GetHashCode(Role obj)
    {
        return
            obj == null
                ? 0
                : obj.Type.GetHashCode();
    }
}
于 2012-06-11T06:40:39.820 に答える