2016-03-04 73 views
0

下面的代码片段显示了我正在使用的方法(尝试)在具有相同VIN时选择车辆的“最新”驱动程序。这种方法被称为AFTER我使用LINQ获取所有车辆在特定位置的所有交易。在C#/ LINQ:如何在列值不恒定的情况下进行分组

group vehicle by new
部分中, DriverLastName是唯一可以逐行更改的列。 vehiclesGrp的返回类型为IQueryable的

var vehiclesGrp = from vehicle in inVehicles 
        group vehicle by new 
           { 
            vehicle.CCName, 
            vehicle.DADDivision, 
            vehicle.DADArea, 
            vehicle.DADDistrict, 
            vehicle.DADCity, 
            vehicle.Vin, 
            vehicle.CostCenter, 
            vehicle.GLDivision, 
            vehicle.VehicleMake, 
            vehicle.FuelTankCapacity, 
            vehicle.FuelType, 
            vehicle.EplanNumber, 
            vehicle.LicensePlate, 
            vehicle.DateInService, 
            vehicle.EstimatedMpg,          
            vehicle.VehicleStatus, 
            vehicle.DriverLastName,          
           } 
         into grp 
         select new VehicleDetail 
         { 
         Account = "", 
         ActualMpg = 0, 
         NoteID = 0, 
         NoteCount = 0, 
         CardNum = "", 
         CCName = grp.Key.CCName, 
         CostCenter = grp.Key.CostCenter, 
         DADArea = grp.Key.DADArea, 
         DADCity = grp.Key.DADCity, 
         DADDistrict = grp.Key.DADDistrict, 
         DADDivision = grp.Key.DADDivision, 
         DateInService = grp.Key.DateInService, 
         DriverLastName = grp.Key.DriverLastName,        
         EplanNumber = grp.Key.EplanNumber, 
         EstimatedMpg = grp.Key.EstimatedMpg, 
         Exception = "", 
         Exceptions = grp.Sum(vehicle => vehicle.Exception == null ? 0 : 1), 
         ExpenseType = "", 
         FuelGals = grp.Sum(vehicle => vehicle.FuelGals), 
         FuelPin = "", 
         FuelTankCapacity = grp.Key.FuelTankCapacity, 
         FuelType = grp.Key.FuelType, 
         FuelUnitCost = 0, 
         GLDivision = grp.Key.GLDivision, 
         IntAcctPd = 0, 
         InvoiceLineItem = "", 
         LicensePlate = grp.Key.LicensePlate, 
         MaintenanceKey = "", 
         Odometer = grp.Max(vehicle => vehicle.Odometer), 
         OutOfServiceDate = null, 
         SwdsStoreCc = "", 
         TotalAllCost = grp.Sum(vehicle => vehicle.TotalAmount), 
         TotalAmount = 0, 
         TotalFuelCost = grp.Sum(vehicle => vehicle.ExpenseType == "FUEL" ? vehicle.TotalAmount : 0), 
         TotalMaintCost = grp.Sum(vehicle => vehicle.ExpenseType == "MAINT" ? vehicle.TotalAmount : 0), 
         TotalMiscCost = grp.Sum(vehicle => vehicle.ExpenseType == "MISC" ? vehicle.TotalAmount : 0), 
         TransactionDate = grp.Max(vehicle => vehicle.TransactionDate), 
         TranTime = "", 
         TranDay = "", 
         UnitCost = 0,        
         VehicleMake = grp.Key.VehicleMake, 
         VehicleStatus = grp.Key.VehicleStatus, 
         VendorAddress = "", 
         VendorCity = "", 
         VendorName = "", 
         VendorState = "", 
         VendorZip = "", 
         Vin = grp.Key.Vin 
         }; 
    return vehiclesGrp; 

如果司机“迈克”对每月的31号,和驱动程序交易“约翰”不,那么麦克应该显示为司机。如果他们都出现在31日,我不关心哪个车手,只要VIN不重复。

对此的任何帮助将不胜感激。

此外,如果有任何信息我遗漏了,请告诉我,我会尽我所能。

+4

只是一个建议,尽量减少你的问题,只有基本的,城市,Mpg ...与问题无关。我们喜欢帮忙,但我们的时间有限,所以当我看到这么久的事情时,我就继续前进。 [如何创建最小,完整和可验证的示例](http://stackoverflow.com/help/mcve) –

+0

不要在'DriverLastName'上进行分组并且执行'DriverLastName = grp.OrderyBy(v => v.DriveDate ).Last()。DriverLastName' – juharr

+0

@JuanCarlosOropeza我会记住这一点以备将来参考,谢谢! –

回答

0

最后我从我最初发布于

var vehiclesGrp = (from v in inVehicles.AsParallel().AsQueryable() 
        orderby v.TransactionDate descending 
        group v by new 
           { 
           v.CCName, 
           v.SwdsStoreCc, 
           v.DADDivision, 
           v.DADArea, 
           v.DADDistrict, 
           v.DADCity, 
           v.Vin, 
           v.CostCenter,          
           v.GLDivision, 
           v.VehicleMake, 
           v.FuelTankCapacity, 
           v.FuelType, 
           v.EplanNumber, 
           v.LicensePlate, 
           v.DateInService, 
           v.EstimatedMpg,          
           v.VehicleStatus,          
           } 
         into gp 
         let uniqueVinAnyDriver = gp.Max(v => v.DriverLastName) 
         select new VehicleDetail 

其中规定,我需要在返回的车辆只有“最新的”司机而言到底是什么改变了分组。

相关问题