2015-04-14 3 views
0

Я написал следующее LINQ запрос в список возврата, а затем итерирующий список отдельно для преобразования времени в часы и получения суммы часов для каждого элемента списка.LINQ Query - Как я могу улучшить свой запрос?

Уверен, что это может быть не сразу, поскольку он отправляет три вызова базы данных.

Могу ли я переписать его лучшим способом, например. GroupBy или каким-либо другим способом присвоить данные модели, конвертируя IdleTime в часы и чем брать сумму IdleTime ??

Модель Класс

public class TestModel 
{ 
    public string TaskSummary { get; set; } 
    public string LocationName { get; set; } 
    public float IdleTime { get; set; } 
    public string Description { get; set; } 
    public float IdleTimeSum { get; set; } 
    public Guid TaskId { get; set; } 
} 

запросов LINQ

List<TestModel> list = _context.Time 
          .Include(x => x.Report) 
          .Include(x => x.Report.Task) 
          .Include(x => x.Report.Task.Location) 
          .Where(x => taskIds.Contains(x.Report.TaskId)) 
          .Select(x => new TestModel 
          { 
           TaskSummary = x.Report.Task.Summary, 
           LocationName = x.Report.Task.Location.Name, 
           IdleTime = x.Duration, 
           Description = x.Description, 
           TaskId = x.Report.TaskId, 
          }).ToList(); 

Как я преобразования в часы?

foreach (var item in list) 
    item.IdleTime = item. IdleTime/60; 

Как я беру сумму?

 foreach (var item in list) 
      item.IdleTimeSum = item. IdleTime; 

ответ

0

Просто добавьте те к вашей проекции:.

      .Select(x => new TestModel 
         { 
          TaskSummary = x.Report.Task.Summary, 
          LocationName = x.Report.Task.Location.Name, 
          IdleTime = x.Duration/60.0f, 
          Description = x.Description, 
          TaskId = x.Report.TaskId, 
          NPTHoursSum = x.Duration/60.0f, 
         }).ToList(); 

Хотя так как вы не показывая, где вы на самом деле sum все, что я подозреваю, есть проблема с этим.

+0

Использование IdleTime = x.Duration/60 всегда дает 0, а не ожидаемое значение. Вот почему я повторяю отдельно. – immirza

+1

Является ли 'IdleTime' целым числом в базе данных? Попробуйте 'IdleTime/60.0f', чтобы заставить деление с плавающей запятой. –

+0

Duration имеет тип int в базе данных. Я получил вашу точку зрения, и я считаю, что единственная причина, по которой IdleTime получала 0. Спасибо D Stanely. – immirza

0

Да Select функция проекции, вы можете просто сделать эти операции в вашем выборе.

.Select(x => new TestModel 
          { 
           TaskSummary = x.Report.Task.Summary, 
           LocationName = x.Report.Task.Location.Name, 
           IdleTime = x.Duration /60.0f, 
           NPTHoursSum = x.Duration/60.0f, 
           Description = x.Description, 
           TaskId = x.Report.TaskId, 
          }).ToList(); 

Если вы используете LINQ to SQL, то операция деления, вероятно, произойдет в db. Если вы действительно хотите, чтобы сделать сумму она должна была бы быть в другом запросе или подзапросом или что-то \

+0

Использование IdleTime = x.Duration/60 всегда дает 0, а не ожидаемое значение. Вот почему я повторяю отдельно. – immirza

+1

@ user1874957 Какой тип времени SQL? Единственная причина, по которой я вижу, что она дает 0, - это int с значением от 0 до 59. – evanmcdonnal

+0

Duration имеет тип int в базе данных. Я получил вашу точку зрения, и я считаю, что единственная причина, по которой IdleTime получал 0. Спасибо evanmcdonnal – immirza

Смежные вопросы