2012-02-06 3 views
1

У меня есть пользовательский интерфейс, который предлагает пользователю выборДинамически/Условно добавив несколько LINQ GroupBy

  1. Тип таблицы (выбор между двумя таблицами почти идентичного набора столбцов)
  2. Колонны
  3. Операция (сумма, среднее, медиана и т.д.)
  4. варианты GroupBy (гроздь флажков)

Я планирую создать метод, который Ретур ns resultset, основанный на пользовательских настройках, и, хотя я думаю, что я прошел через все остальное (кроме выбора таблицы), я зациклился на том, как использовать GroupBy (или любой другой способ) для создания группы по статьям один за другим ,

Это единственное, что сейчас заставляет меня думать о том, чтобы вернуться к использованию простого генерации строки SQL для этого.

Вот код, который я до сих пор:

public IQueryable<ACSImpactAnalysisModel> GetDataForReport(TableType table, uint year,  OpType operation, uint groupOptions, uint measures) 
    { 
     var dataContext = new ACSImpactEntities(); 

     var discharges = from p in dataContext.ACSNationals 
         select new 
         { 
          p.YEAR, 
          p.AGE, 
          p.FEMALE, 
          p.RACE, 
          p.ASOURCE, 
          p.PAY1, 
          LOS = p.LOS > 0 ? p.LOS : 0, 
          CHG = p.TOTCHG > 0 ? p.TOTCHG : 0, 
          NPR = p.NPR > 0 ? p.NPR : 0, 
          DIS_STS = p.DISPUB04 > 0 ? p.DISPUB04 : 0 
         }; 

     //if (table == TableType.states) 
     // discharges = from p in dataContext.ACSStates 
     //     select p; 


     List<int> years = new List<int>(); 
     if ((year & Constants.YEAR2008) == Constants.YEAR2008) years.Add(2008); 
     if ((year & Constants.YEAR2009) == Constants.YEAR2009) years.Add(2009); 

     discharges = discharges.Where(a => years.Any(b => a.YEAR == b)); 

     if ((groupOptions & Constants.SEX) == Constants.SEX) 
      discharges = discharges.Where(a => a.FEMALE > 0); 

     if ((groupOptions & Constants.RACE) == Constants.RACE) 
      discharges = discharges.Where(a => a.RACE > 0); 

     if ((groupOptions & Constants.ER_ADMISSION) == Constants.ER_ADMISSION) 
      discharges = discharges.Where(a => a.ASOURCE > 0); 

     if ((groupOptions & Constants.PAYER_TYPE) == Constants.PAYER_TYPE) 
      discharges = discharges.Where(a => a.PAY1 > 0); 

     var analysis = from a in discharges 
         select new 
         { 
          AGE_GROUP = 
          (
           a.AGE >= 18 && a.AGE <= 44 ? "18-44" : 
           a.AGE >= 45 && a.AGE <= 54 ? "45-54" : 
           a.AGE >= 55 && a.AGE <= 64 ? "55-64" : ">= 65" 
          ), 
          SEX = (a.FEMALE == 1 ? "FEMALE" : "MALE"), 
          RACE = 
          (
           a.RACE == 1 ? "WHITE" : 
           a.RACE == 2 ? "BLACK" : 
           a.RACE == 3 ? "HISPANIC" : 
           a.RACE == 4 ? "ASIAN OR PACIFIC ISLANDER" : 
           a.RACE == 5 ? "NATIVE AMERICAN" : 
           a.RACE == 6 ? "OTHER" : "" 
          ), 
          ASOURCE = (a.ASOURCE == 1 ? "ER" : "NON ER"), 
          PAY1 = 
          (
           a.PAY1 == 1 ? "MEDICARE" : 
           a.PAY1 == 2 ? "MEDICAID" : 
           a.PAY1 == 3 ? "PRIVATE INCLUDE HMO" : 
           a.PAY1 == 4 ? "SELF PAY" : 
           a.PAY1 == 5 ? "NO CHARGE" : 
           a.PAY1 == 6 ? "OTHER" : "" 
          ), 
          a.YEAR, 
          a.FEMALE, 
          a.LOS, 
          a.CHG, 
          a.NPR, 
          a.DIS_STS 
         }; 

     var grouped_analysis = analysis.GroupBy(groups => groups.YEAR); 

     //These lines generate error, but this is something what I want to be able to do 
     if ((groupOptions & Constants.AGE_GROUP) == Constants.AGE_GROUP) 
      grouped_analysis = analysis.GroupBy(age_group => age_group.AGE_GROUP); 

     if ((groupOptions & Constants.ASOURCE) == Constants.ASOURCE) 
      grouped_analysis = analysis.GroupBy(asource => asource.ASOURCE); 


     return analysis; 
    } 
+0

это EF или Linq2Sql? –

+0

im используя LINQ to Entities –

ответ

0

Вы можете использовать Dynamic Linq, и вы, возможно, потребуется также Predicate Builder.

+0

Что касается Dynamic Linq, не будет ли это победить всю цель написания безопасного запроса типа? Что касается Predicate Builder, я не мог понять, как было бы полезно получить несколько условных групповых добавлений к набору результатов. Кажется, более подходящее здание динамическое, где/filter clauses –

+0

Да, действительно. Но вы можете справиться с этим с модульным тестированием. –

+0

Полезно знать о Predicate Builder при работе с такими запросами (и да, для Where) –