2012-06-08 22 views
3

我是RavenDB的新手,我在這裏遇到了一個條件。基本上這是我想要的。我有一份員工列表在RavenDB,我需要獲取員工誰是類型爲「合同」。我試圖用基本的LINQ查詢的不是,但我無法來解決這個問題,因爲我歌廳,如「法不支持」和「異常不能懂得如何翻譯...等「。如何在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 
    } 

如果有人能夠幫助我解決這個問題,我真的很喜歡它。

感謝,
卡皮爾

+0

@PranayRana:沒有這些查詢的工作對我來說 – wizzardz

+0

試用谷歌羣體。我確信有一種解決方法,但我也很難。 https://groups.google.com/forum/?fromgroups#!forum/ravendb –

回答

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(); 
    } 
} 
+0

@M Afifi:這是不可能的朋友,「y」是類型「角色」不是用戶類型 – wizzardz

+0

@wizzardz謝謝,採取2! –

+0

@M Afifi:顯示編譯錯誤:( – wizzardz

0

嘗試:

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

我已經更新了我的查詢它應該是什麼。 (目前失敗)

我已經向Ayende提交了一個失敗的測試,以查詢您在Google Group上的查詢。

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

+0

沒有運氣,仍然返回相同的結果:( – wizzardz

+0

有趣的... *激發VS * – Phill

+0

感謝您提交谷歌組中的失敗測試 – wizzardz