Рефакторинг после того, как сгруппированные в LINQ


Есть ли способ, чтобы выполнить рефакторинг этого?

objLeadTimeReportResult = 
    (from prop in propList
     join book in booking on prop.PropertyId equals book.PropertyId into j
     from book in j.DefaultIfEmpty()
     group book by new { prop.PropertyId, prop.PropertyName } into groupedLeadTime
         select new LeadTimeReportResult
         {
             PropertyId = groupedLeadTime.Key.PropertyId,
             PropertyName = groupedLeadTime.Key.PropertyName,
             Today = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days == 0) ? 1 : 0),
             Days1_2 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 1 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 2) ? 1 : 0),
             Days3_6 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 3 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 6) ? 1 : 0),
             Days7_10 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 7 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 10) ? 1 : 0),
             Days11_15 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 11 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 15) ? 1 : 0),
             Days16_30 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 16 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 30) ? 1 : 0),
             Days31_45 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 31 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 45) ? 1 : 0),
             Days46_60 = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days >= 46 && (item.CheckInDate.Date - item.BookingDate.Date).Days <= 60) ? 1 : 0),
             Days60Plus = groupedLeadTime.Sum(item => ((item.CheckInDate.Date - item.BookingDate.Date).Days > 60) ? 1 : 0)
         }).ToList();

Дополнительная Информация

Мой старший программист сказал мне, чтобы использовать некоторые вместо графа, он утверждал, что это сделает более высокую производительность при использовании на MSSQL сервер.



283
3
задан 22 августа 2011 в 08:08 Источник Поделиться
Комментарии
1 ответ

(1). Вы можете создать метод exntession, чтобы проверить, что пункт находится в пределах диапазона.

(2). Я использую число, а не сумма, потому что вы просто посчитайте количество дней в заданном интервале. Это более естественно.

(3). Я бы проверил производительность этого запроса и пытаться кэшировать результат этого соединения и/или группировка с помощью метода, который требует, жаждет оценки. Список() например. Он может помочь с большим количеством traverals каждой группы в сумме()/количество() методы.

(4). Примечание для получения дополнительных сведений. Даже если sum() в LINQ к SQL-это гораздо быстрее, чем count (), вы все равно можете иметь MyCount() реализован как sum() внутри. Это позволит вам иметь хорошее представление, как ваш старший программист упомянул и скрыть это "? 1 : 0" conidition.

 var tempQuery = from prop in propList
join book in booking on prop.PropertyId equals book.PropertyId into j
from book in j.DefaultIfEmpty()
group book by new { prop.PropertyId, prop.PropertyName }.ToList();

objLeadTimeReportResult = from tempVar in tempQuery
select new LeadTimeReportResult
{
PropertyId = tempVar.Key.PropertyId,
PropertyName = tempVar.Key.PropertyName,
Today = tempQuery.Count(item => (item.WithinRange()),
Days1_2 = tempQuery.Count(item => (item.WithinRange(1,2)),
Days3_6 = tempQuery.Count(item => (item.WithinRange(3,6)),
Days7_10 = tempQuery.Count(item => (item.WithinRange(7,10)),
Days11_15 = tempQuery.Count(item => (item.WithinRange(11,15)),
Days16_30 = tempQuery.Count(item => (item.WithinRange(16,30)),
Days31_45 = tempQuery.Count(item => (item.WithinRange(31,45)),
Days46_60 = tempQuery.Count(item => (item.WithinRange(46,60)),
Days60Plus = tempQuery.Count(item => (item.GreaterThan(60));
}.ToList();

5
ответ дан 22 августа 2011 в 09:08 Источник Поделиться