我有一个相当简单的要求,但环顾四周,我无法得到一个简单的答案。我查看过MSDN论坛,Exper Exchange并没有给我任何实质内容。
我有以下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
答案 0 :(得分:5)
希望这会有所帮助......
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);
}
}