2016-05-24 2 views
0

Сценарий:Как получить несколько строк уровня с использованием linq в C#?

класс Работа может иметь несколько задач с и каждый Task может иметь несколько Charge с. Я хочу сделать, чтобы получить список всех Заряд 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

Спасибо за ответы, ребята. В настоящее время я пытаюсь использовать ваши предлагаемые решения, и как только это удалось, будет отмечен соответствующий ответ как ** Ответ **. Еще раз спасибо. –

ответ

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(); 
Смежные вопросы