2009-06-08 3 views
3

У меня есть то, что кажется довольно простым требованием, но оглядываясь, я не могу получить простой ответ на это. Я посмотрел на форумах MSDN, Exper Exchange и ничего существенного мне не дали.Условная группа По заявлению с использованием LINQ

У меня есть следующий код Linq

Dim SummaryLog As IQueryable(Of clPartCountSummary)  
SummaryLog = From Inventory In db.tblPartCounts _ 
      Where Inventory.InventoryCountId = InventoryCountId _ 
      And Not Inventory.ActionId.HasValue _ 
      Group By PartNumber = Inventory.PartNumber _ 
      , Inventory.RevLevel, SAPLocation = Inventory.SAPLocation _ 
      Into AggregatedProdLog = Group, Qty = Sum(Inventory.Quantity) _ 
      Select New clPartCountSummary With 
       {.PartNumber = PartNumber, 
       .RevLevel = RevLevel, 
       .Qty = Qty, 
       .SAPLocation = SAPLocation} 

Я хочу, чтобы иметь возможность условно группировать по на RevLevel и SAPLocation. Я всегда буду группироваться по PartNumber, но два других являются необязательными. Итак, если переменная bRevLevel истинна, тогда мы группируем ее по RevLevel, и если bSAPLocation истинно, тогда мы группируем SAPLocation.

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

Спасибо, Tomasz

ответ

4

Надежда это помогает ....

public class TblPartCount 
{ 
    public int InventoryCountID { get; set; } 
    public int? ActionID { get; set; } 
    public string PartNumber { get; set; } 
    public int RevLevel { get; set; } 
    public string SAPLocation { get; set; } 
    public int Quantity { get; set; } 
} 

private static void ConditionalGroupBy() 
    { 
     bool pCheck = true; 

     var lList = new List<TblPartCount> 
         { 
          new TblPartCount { InventoryCountID = 1, ActionID = 2, PartNumber = "123", RevLevel = 1, SAPLocation = "AAAA", Quantity = 100 }, 
          new TblPartCount { InventoryCountID = 1, ActionID = 2, PartNumber = "123", RevLevel = 1, SAPLocation = "BBBB", Quantity = 200 } 
         }; 

     var lOutput = lList 
          .Where(pArg => pArg.InventoryCountID == 1) 
          .Where(pArg => pArg.ActionID != null) 
          .GroupBy(pArg => new 
          { 
           PartNumber = pArg.PartNumber, 
           RevLevel = pCheck ? pArg.RevLevel : 0, 
           SAPLocation = pCheck ? pArg.SAPLocation : String.Empty 
          }) 
          .Select(pArg => 
            new 
            { 
             PartNumber = pArg.Key.PartNumber, 
             RevLevel = pArg.Key.RevLevel, 
             SAPLocation = pArg.Key.SAPLocation, 
             Qtry = pArg.Sum(pArg1 => pArg1.Quantity) 
            }); 

     foreach (var lItem in lOutput) 
     { 
      Console.WriteLine(lItem); 
     } 
    } 
Смежные вопросы