2009-06-08 1 views
3

私はかなり単純な要件と思われるものを持っていますが、周りを見回すとこれに対する簡単な答えは得られません。私はMSDNフォーラム、ExperExchangeを見てきましたが、何も私に与えられていませんでした。LINQを使用した条件付きグループステートメント

私はRevLevelSAPLocationにすることにより、条件付きのグループにできるようにしたい、次の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} 

を持っています。私は常にPartNumberでグループ化しますが、他の2つはオプションです。したがって、変数bRevLevelがtrueの場合はRevLevelでグループ化し、bSAPLocationが真の場合はSAPLocationでグループ化します。

何か助けていただければ幸いです。複数のSummaryLog定義が魅力的に見える段階です。

おかげで、トマシュこのことができます

答えて

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); 
     } 
    }