2017-06-28 44 views
0

我已經在我的項目以下層次:LINQ過濾第N個級別嵌套列表

  1. 活動
  2. 任務
  3. 步驟
  4. 迴應

這意味着一個活動有許多任務,而這又有很多步驟,一個步驟有很多回應。

這裏是我的POCO類:

public class Activity 
{ 
    public virtual ICollection<Task> Tasks { get; set; } 
} 

public class Task 
{ 
    public virtual ICollection<Step> Steps{ get; set; } 
} 


public class Step 
{ 
    public virtual int DisplayOrder { get; set; } 
    public virtual ICollection<Response> Responses{ get; set; } 
} 

public class Response 
{ 
    public virtual int UserId { get; set; } 

    public virtual int ResponseText{ get; set; } 
} 

現在,我需要回到這是由ActivityId排序並具有DisplayOrder有序步驟,也是一個迴應只屬於給定UserId一個List<Activity>

這是我曾嘗試:

Activities.ToList() 
       .ForEach((activity) => activity.Tasks.ToList() 
       .ForEach((task) => task.Steps = task.Steps.OrderBy(s => s.DisplayOrder).ToList() 
       .ForEach((step) => step.Responses = step.Responses.Where(r => r.UserId == RequestorUserId))) 
       )); 

這是給我的錯誤:

Cannot implicitly convert type 'void' to ICollection<Step>

+0

我提供了一個答案,如果它可以幫助你,請給予好評和接受。 –

回答

0

在foreach擴展方法不返回任何東西,你想設置的結果任務。腳步。您可以通過使用Select方法來改變線的對象達到預期的效果

Activities.ToList() 
      .ForEach((activity) => activity.Tasks.ToList() 
      .ForEach((task) => task.Steps = task.Steps.OrderBy(s => s.DisplayOrder).ToList() 
      .Select((step) => 
       { 
        step.Responses = step.Responses.Where(r => r.UserId == 1).ToList(); 
        return step; 
       }).ToList())); 

此外,你再不需要所有的ToList的這可能是值得改變你的類型,如果可能的IEnumerable的,而不是ICollection的()調用。

如果您需要分配的結果,那麼你就需要更換第一的ForEach以及 - 你可以試試:

var a = Activities.ToList() 
      .Select((activity) => 
       { 
        activity.Tasks.ToList() 
         .ForEach((task) => task.Steps = task.Steps.OrderBy(s => s.DisplayOrder).ToList() 
         .Select((step) => 
          { 
           step.Responses = step.Responses.Where(r => r.UserId == 1).ToList(); 
           return step; 
          }).ToList()); 
        return activity; 
       }); 
+0

當我將它賦值給某個'var'變量時,說不能將void分配給一個隱式類型變量 – SJMan

+0

@SJMan,這將是完全相同的問題 - 即ForEach不返回任何東西。如果您需要分配它 - 這在您的問題中沒有明確說明 - 您需要將第一個ForEach轉換爲選擇 - 請參閱我編輯的答案 –

+0

@SJMan解決了問題嗎?如果是這樣,請接受解決方案,因爲它鼓勵人們真正幫助解答您的問題。 –