2017-01-05 57 views
-1

我有兩個列表和基於一組值的過濾器。如何在使用foreach循環列出out中設置值

var UserIdList = response.Users.Select(p => p.Id).ToList(); 

var filteredRecords = 
(from o in om.Organizations join u in om.Users on o.Id equals u.OrganizationId where UserIdList.Contains(u.Id)  
       select new { Enabled = o.Enabled, Id = u.Id }).ToList(); 

現在我想在 'response.Users' 設置'Exists'屬性爲true,如果 'Id' 在filteredRecords存在。

請讓我知道如何使用foreach循環設置值。 我試圖與

response.Users.Where(x => x.Exists = (filteredRecords .Any(z => z.Id == x.Id))).ToList(); 

,但因爲它是隻給過濾結果可能不會成功。 我想要完整的記錄匹配,而不是

+0

「foreach」有什麼問題? – Sefe

+0

什麼是響應的性質。用戶,om.Organizations和om.Users。它們都是簡單的IEnumerable(即在內存集合中)還是全部/部分IQueryable(db查詢)。 –

+0

我已經厭倦了response.Users.Where(x => x.Exists =(filteredRecords .Any(z => z.Id == x.Id)))。ToList();但只能得到匹配的記錄,但我想要得到所有的記錄。 –

回答

2

Linq並不真正支持更新場景,因爲它用於查詢數據。

對於列表但有一個foreach擴展方法:

UserList 
    .ToList() 
    .ForEach(item=> item.Exists = filteredRecords.Any(f=> f.Id == item.Id)); 

這是更易懂,更容易比foreach循環明白...

編輯(問題更新後)

// You can't use this... it won't even compile, 
// x.Exists = ... is an assignment not a condition 
response.Users.Where(x => x.Exists = (filteredRecords .Any(z => z.Id == x.Id))).ToList(); 

你想要做的是與一部分用戶一起工作並更新值。

response 
    .Users 
    .Where(x=> filteredRecords.Any(z => z.Id == x.Id)) 
    .ToList() // This materialises your IEnumerable/IQueryable to allow the ForEach extension method 
    .ForEach(x => x.Exists = true); 

你當然可以使用的:

var usersToEnable = response.Users.Where(x=> filteredRecords.Any(z => z.Id == x.Id); 
foreach(var user in usersToEnable) 
    user.Enabled = true; 
0

至於直接回應:

請讓我知道我可以使用foreach循環設定值跟了出去。我曾嘗試過

response.Users.Where(x => x.Exists = (filteredRecords .Any(z => z.Id == x.Id))).ToList(); but could not succeed as it is giving only 

過濾結果。我想這是匹配的,並且完全記錄 不

你所做的事有選擇你希望有Exists設置爲true響應用戶項目的集合。

現在,您需要在此過濾的集合中設置該bool,然後返回完整的response集合,而不是返回過濾的集合。

我認爲這是你感到困惑的地方。