2015-10-24 53 views
-1

我得到了一個列表如下:LINQ:過濾器的價值由子列表

int[] listOfUserIds = new int[]{1,2,5}; 

var groups = db.some_table.Where(x => x.isOpen == true) 
         .Select(t => new Models.XModel() { 
          Id = t.Id, 
          Name = t.name, 
          Users = t.Users.Where(x => x.Age > 25).Select(user => new Models.UsersModel() 
          { 
           Name = user.Name, 
           UserId = user.UserId 
          }) 
         }); 

現在從這個groups名單我想獲得的記錄,其中有ATLEAST一個userUserId是內listOfUserIds

如何輕鬆實現這一點而不需要循環?

+0

沒有'for'循環,這是不可能的。 LINQ包含'for'循環 – Fabio

+0

我的意思是沒有明確使用for循環,如果有更高的抽象可用 –

回答

0

添加1個更多的條件,您Where條款:

x.Users.Any(user => listOfUserIds.Contains(user.UserId)) 

您的代碼:

var groups = db.some_table.Where(x => x.isOpen == true && x.Users.Any(user => listOfUserIds.Contains(user.UserId))) 
         .Select(t => new Models.SomeModel() { 
          Id = t.Id, 
          Name = t.name, 
          Users = t.Users.Where(x => x.Age > 25).Select(user => new Models.UsersModel() 
          { 
           Name = user.Name, 
           UserId = user.UserId 
          }) 
         }); 

爲了提高性能,你可以建立一個HashSet<int>

int[] listOfUserIds = new int[]{1,2,5}; 
HashSet<int> hash = new HashSet<int>(listOfUserIds); 

var groups = db.some_table.Where(x => x.isOpen == true && x.Users.Any(user => hash.Contains(user.UserId))) 
          .Select(t => new Models.SomeModel() { 
           Id = t.Id, 
           Name = t.name, 
           Users = t.Users.Where(x => x.Age > 25).Select(user => new Models.UsersModel() 
           { 
            Name = user.Name, 
            UserId = user.UserId 
           }) 
          }); 

隨着HashSet<int>,這個操作hash.Contains(x.Id)O(1),而不是O(n)listOfUserIds

+0

HashSet沒有推式方法 – Backs

+0

@Backs:這是一個錯誤,更新 –

+0

請你澄清爲什麼x.Id在listOfUserIds中。 contains()?不應該是user.UserId嗎? –