2012-03-21 3 views
3

У меня есть таблица, которая имеет около 15 различных полей, некоторые из которых являются JobId (целое поле), стоимость (целое поле) и LastUpdated (поле DateTime)Объединение двух запросов LINQ в одну

 
JobID Cost  LastUpdated 
1  10  10-July-2011 
1  15  11-June-2011 
2  25  5-May-2011 
1  15  12-April-2011 

Is возможно ли написать один запрос LINQ, чтобы получить сумму Cost for job id = 1, а также последнюю дату такой стоимости?

Пример вывода запроса для выборки данных выше, чтобы выглядеть следующим образом:

40 , 10-july-2011

В настоящее время я делаю это с двумя разными запросами Linq, как это, в результате двух обращений к базе данных из сайт в данном конкретном случае.

//for last updated 
(from row in MyTable where row.JobID == 1 
orderby row.LastUpdated descending 
select row.LastUpdated).First() 

//for sum of cost 
(from row in MyTable 
where row.JobID == 1 
select row.Cost).Sum() 

Будет ли один запрос linq лучше в таком случае? Подобные случаи, подобные этому во время загрузки страницы, приведут к нескольким ударам в базе данных, всего около 18, к 9 различным таблицам. При объединении суммы и даты LastUpdated в одном запросе я пытаюсь уменьшить количество попаданий до 9, по одному для каждой таблицы.

Спасибо за ваше время ...

ответ

2

Да, вы можете сделать groupby как этот

var query = from row in MyTable 
      group row by row.JobID into rows 
      where rows.Key == 1 
      select new 
      { 
       LastUpdated = rows.Select(x => x.LastUpdated).OrderByDescending(x => x).First(), 
       Cost = rows.Sum(x => x.Cost), 
      }; 
+0

Я пробовал это в linqpad .. и получил ошибку: никакой перегрузки для метода «OrderByDescending» не принимает 0 аргументов. – user20358

+0

Однако эта строка, которую я изменила, сделала трюк. LastUpdated = rows.OrderByDescending (x => x.LastUpdated) .First(). LastUpdated – user20358

+0

@ user20358 - извините, я обновил до * .OrderByDescending (x => x) *, который должен работать для вас сейчас. Ваша линия тоже хороша. – Aducci

2

вы можете использовать это:

MyTable.Where(x => x.JobID == 1) 
     .OrderByDescending(x => x.LastUpdated) 
     .GroupBy(x => x.JobID) 
     .Select(x => new { LastUpdated = x.First().LastUpdated, 
          Sum = x.Sum(y => y.Cost) }); 
+0

спасибо Даниилу за быстрый ответ, не означает быть грубым, но только для моего понимания, как этот запрос лучше, чем тот, который дал Адуччи? Я запускал оба в профилировщике SQL, и они оба, похоже, потребляют столько же процессорного времени и времени. Однако его запрос кажется более читаемым для меня, исходя из фона SQL. Является ли это лучшим способом для написания запросов Linq, или я должен идти с тем, что считаю более удобочитаемым. Опять же, я не собираюсь быть грубым или сомневаться в ваших знаниях. это только для моего понимания ... спасибо :) – user20358

+0

@ user20358: Ответы должны быть эквивалентными. Мне лично не нравится синтаксис запроса и трудно читать, поэтому я использую методы. Это вопрос личных предпочтений. –

+0

ОК. Спасибо, Дэниэл. – user20358

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