2016-05-24 4 views
0

シナリオ:C#でlinqを使用して複数レベルの深い広告申込情報を取得するにはどうすればよいですか?

クラス仕事は、複数のタスク Sを持つことができ、各タスクは、複数のチャージ Sを持つことができます。私がしたいことは、すべての特定の仕事のためにチャージのリストを取得することです。以下は私が現在これを解決するために使用しているコードです。しかし、私はそれが最良の可能な解決策ではないと感じています(ループが少ないためです)。誰も私はLinq /ラムダ式を使用してそれを行うことができます示唆していただけますか?ありがとう。

コード:

//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

感謝を。私は現在、あなたの提案された解決策を試しており、成功した場合は、それぞれの回答を**回答**とマークします。再度、感謝します。 –

答えて

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 /ラムダ式を使用してそれを行うことができます示唆していただけますか?

LINQの方法では、まだいくつかのループが実行され、いくつかのクラスとメソッドが生成されることを理解する必要があります。より効率的ではありませんが、より保守的で、維持し理解するのは簡単です。

1

あなたはこの道を行くことができます回答の男性のための

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