2015-03-03 2 views
0

У меня есть метод, который я использую для создания сводного отчета на основе параметров, которые пользователь выбирает в списках выбора, для подсчета количества типов тестов, которые завершены в регионе , с подмножеством, в пределах диапазона дат.Lambda Linq Iqueryable group - добавить еще одну группу

Вот как выглядят данные, как: Завершена Test Считает по местоположению С 1 февраля 2015 года до 1 MAR 2015

Total TestType Location Region Division 
455 24 Hour Lab 1  City 1 Division A 
28  24 Hour Lab 2  City 1 Division A 
95  24 Hour Clinic Z City 2 Division A 
189 24 Hour Clinic Y City 2 Division A 

Вот что это может выглядеть для другого типа испытания, в тот же период времени :

Total TestType Location Region Division 
285 48 Hour Lab 1  City 1 Division A 
12  48 Hour Lab 2  City 1 Division A 
75  48 Hour Clinic Z City 2 Division A 
106 48 Hour Clinic Y City 2 Division A 

Теперь пользователи хотели бы видеть итоговую разбивку по testType в одном отчете (в SQL, добавив еще один атрибут к группе). В моем списке выбора testTypeId, я использую 0 как мой «Все». В идеальном мире у меня было бы еще одно дополнение к IQueryable, если testTypeId == 0, так что я могу сохранить тот же частный метод, а не писать новый запрос.

Вот что мы хотели бы, чтобы данные выглядят как в «ALL» ситуации:

Total TestType Location Region Division 
455 24 Hour Lab 1  City 1 Division A 
285 48 Hour Lab 1  City 1 Division A 
59  12 Lead Lab 1  City 1 Division A 
28  24 Hour Lab 2  City 1 Division A 
12  48 Hour Lab 2  City 1 Division A 
95  24 Hour Clinic Z City 2 Division A 
75  48 Hour Clinic Z City 2 Division A 
5  12 Lead Clinic Z City 2 Division A 
189 24 Hour Clinic Y City 2 Division A 
106 48 Hour Clinic Y City 2 Division A 
8  12 Lead Clinic Y City 2 Division A 

В приведенном ниже примере показано, что у меня есть то, что я хотел бы добавить в него, но синтаксис говорит мне, что я не могу взять IQueryable, содержащий IGrouping и конвертировать его в целевой тип IQueryable.

Может ли кто-нибудь указать мне хорошее направление здесь?

private CompletedCountReport GetCompletedCountsByRegion(int regionId, DateTime? startDate, DateTime? endDate, int testTypeId) 
{ 
    var ccRpt = new CompletedCountReport { CompletedCounts = new List<CompletedCount>(), StartDate = startDate, EndDate = endDate, SelectedRegionID = regionId}; 

    var query = HolterTestDao.FindAll(new GetCompletedByRegionIdAndDates(regionId, startDate.Value, endDate.Value)); 

    // a specific test type was selected 
    if (testTypeId > 0) 
    { 
     query = query.Where(x => x.HolterTestType == testTypeId); 
    } 
    // THIS IS WHAT I WANT TO ADD -> otherwise group by test type <- THIS IS WHAT I WANT TO ADD. 
    if (testTypeId == 0) 
    { 
     query = query.GroupBy(x => x.HolterTestType); 
    } 
    // order by locationID within the region. 
    query = query.OrderBy(x => x.Location.ID); 

    var htList = query.ToList(); 

    // now Group by Location, to get counts. 
    var reportContents = htList.GroupBy(x => x.Location.ID); 
    foreach (var r in reportContents) 
    { 
     var rList = r.ToList(); 

     var cc = new CompletedCount(); 
     var loc = LocationDao.FindById(r.Key); 
     cc.Description = loc.Description; 
     cc.RegionId = loc.Region.ID; 
     cc.DivisionId = loc.Region.Division.ID; 
     cc.TestTypeId = testTypeId; 
     cc.Count = rList.Count; 
     ccRpt.CompletedCounts.Add(cc); 
    } 

    return ccRpt; 
} 
+1

Почему вы пытаетесь условно группировать данные? Просто * безоговорочно * группировать данные. – Servy

+0

Значит, вы говорите всегда группу как по месту, так и по типу теста? Иногда они хотят видеть только цифры только для одного типа теста, иногда они хотят видеть все типы тестов. –

+0

. Чтобы рассказать нам, как вы хотите, чтобы IGrouping разрешился. Если в одном IGrouping имеется несколько элементов, вы выбираете первый? – Shoe

ответ

0

Мое решение было OrderBy Место и HolterTestType, то GroupBy место для основного содержания, а затем добавить еще одну группировку в моем цикле по результатам, чтобы получить отсчеты от типа теста:

 query = query.OrderBy(x => x.Location.ID).ThenBy(x => x.HolterTestType); 
     var htList = query.ToList(); 

     // now Group by Location. 
     var reportContents = htList.GroupBy(x => x.Location.ID); 

     foreach (var r in reportContents) 
     { 
      //Group by TestType, to get counts. 
      var t = r.GroupBy(x => x.HolterTestType); 
      var tList = t.ToList(); 

      foreach(var u in tList) 
      { 
       var cc = new CompletedCount(); 
       var loc = LocationDao.FindById(r.Key); 
       cc.Description = loc.Description; 
       cc.RegionId = loc.Region.ID; 
       cc.DivisionId = loc.Region.Division.ID; 
       cc.TestTypeId = u.Key; 
       cc.Count = u.Count(); 
       ccRpt.CompletedCounts.Add(cc); 
      } 
     } 
Смежные вопросы