2016-05-24 26 views
0

場景:如何在c#中使用linq獲取多級深度項目?

工作可以有多個任務 S和每個任務可以有多個充電秒。我想要做的是獲得任何特定工作的所有費用的清單。下面是我目前用來解決這個問題的代碼。但我有一種感覺,它不是最好的解決方案(因爲它使用了很少的循環)。任何人都可以請建議我如何使用Linq/Lambda表達式來做到這一點?謝謝。

代碼:

//Model Class 
public class Job 
{ 
    public int id { set; get; } 
    public List<Task> Tasks { set; get; } 
} 

public class Task 
{ 
    public int id { set; get; } 
    public List<TaskCharge> TaskCharges { set; get; } 
} 

public class TaskCharge 
{ 
    public int id { set; get; } 
    public decimal Amount { set; get; } 
    public DateTime DateAdded { set; get; } 
} 
// Method to GetTransactions 
public void GetTransactions() 
{ 
    var transactions = new List<Transaction>(); 
    if (job.Tasks != null && job.Tasks.Any()) 
    { 
     foreach (var task in job.Tasks) 
     { 
      if (task.TaskCharges != null && task.TaskCharges.Any()) 
      { 
       foreach (var tc in task.TaskCharges) 
       { 
        if (tc.IsAccepted) 
        { 
         transactions.Add(new Transaction 
         { 
          //assign properties like below 
          //Description = tc.Description, 
          //TransactionAmount = tc.Amount 
          //and so on 
         }); 
        } 
       } 
      } 
     } 
    } 
} 
+0

感謝您的答覆傢伙。我目前正在嘗試您的建議解決方案,一旦成功,將相應答案標記爲** Answer **。再次感謝。 –

回答

1

這個怎麼樣?

var tasks = job.Tasks ?? Enumerable.Empty<Task>(); 
var transactions = tasks 
    .Where(t => t.TaskCharges != null) 
    .SelectMany(t => t.TaskCharges) 
    .Where(tc => tc.IsAccepted) 
    .Select(tc => new Transaction(...)); 
1

你能做到在幾個方面:

transactions.AddRange(from task in job.Tasks 
         where task.TaskCharges != null && task.TaskCharges.Any() 
         from tc in task.TaskCharges 
         where tc.IsAccepted 
         select new Transaction {}); 


foreach (var task in job.Tasks.Where(task => task.TaskCharges != null && task.TaskCharges.Any())) 
{ 
    transactions.AddRange(from tc in task.TaskCharges 
          where tc.IsAccepted 
          select new Transaction {}); 
} 

但我有一種感覺,它不是最佳的解決方案(因爲它是使用少量循環)。任何人都可以請建議我如何使用Linq/Lambda表達式來做到這一點?

您需要明白,在LINQ方式下,仍然會運行很少的循環,也很少會生成類和方法。它不是更高效但更好,也許易於維護和理解。

1

你可以這樣說:

var transactions = job.Tasks? 
          .SelectMany(task => task.TaskCharges) 
          .Where(taskCharge => taskCharge.IsAccepted) 
          .Select(taskCharge => new Transaction 
          { 
           //assign properties 
          }).ToList(); 
相關問題