【问题标题】:How to add calculated fields to SQL list如何将计算字段添加到 SQL 列表
【发布时间】:2016-04-08 20:09:11
【问题描述】:

我正在跟踪卡车的燃料。

        List<FuelLightTruckDataSource> data = new List<FuelLightTruckDataSource>();

        using (SystemContext ctx = new SystemContext())
        {

            List<FuelLightTruckDataSource> dataTransfers
                = ctx.FuelTransfer
                    .Where(tr => DbFunctions.TruncateTime(tr.Date) >= from.Date && DbFunctions.TruncateTime(tr.Date) <= to.Date
                        //&& tr.ToAsset.AssignedToEmployee.Manager
                        && tr.ToAsset.AssignedToEmployee != null
                        && tr.ToAsset.AssetType.Code == "L"
                        && tr.Volume != null)
                        //&& (tr.FuelProductType.FuelProductClass.Code == "GAS" || tr.FuelProductType.FuelProductClass.Code == "DSL"))
                    .GroupBy(tr => new { tr.ToAsset, tr.Date, tr.FuelTankLog.FuelProductType.FuelProductClass, tr.FuelTankLog.FuelCard.FuelVendor,tr.Volume, tr.ToAssetOdometer })
                    .Select(g => new FuelLightTruckDataSource()
                    {
                        Asset = g.FirstOrDefault().ToAsset,
                        Employee = g.FirstOrDefault().ToAsset.AssignedToEmployee,
                        ProductClass = g.FirstOrDefault().FuelTankLog.FuelProductType.FuelProductClass,
                        Vendor = g.FirstOrDefault().FuelTankLog.FuelCard.FuelVendor,
                        FillSource = FuelFillSource.Transfer,
                        Source = "Slip Tank",
                        City = "",
                        Volume = g.FirstOrDefault().Volume.Value,
                        Distance = g.FirstOrDefault().ToAssetOdometer,
                        Date = g.FirstOrDefault().Date,
                    })
                    .ToList();

查询后,我需要计算消耗率和行驶距离。 "Result" 将是一个包含 "consumptionRate" 和 "Distance" 的条目集合,它与上面的查询匹配。

            // Get consumption rate data for each asset
            foreach (int assetId in assetIds)
            {
                FuelConsumptionRateQueryResult result = FuelConsumptionRateQueryService.Get(assetId, from, to, AssetCounterType.Odometer);
                result.Entries.ToList();
            }

我的问题是如何获得我的 foreach 循环的结果并将它们添加到我以前的查询/列表中,以便它们可以显示在报告中?

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    您的问题似乎是由于您在foreach 循环的每次迭代中都将result 声明为一个新变量,从而导致result 被覆盖。此外,一旦您完成了 foreach 循环,result 就不在范围内。

    相反,您可能想要更接近:

    var allResults = new List<T>; //where T is whatever object type this is (FuelConsumptionRateQueryResult?)
    
    foreach (int assetId in assetIds)
    { 
        //this is a new variable at each iteration of the loop
        FuelConsumptionRateQueryResult result = FuelConsumptionRateQueryService.Get(assetId, from, to, AssetCounterType.Odometer);
        allResults.Add(result); //add the current result to your list (outside the scope of this loop)
    }
    

    基本上,在循环之外声明您的变量并将Add 每个单独的结果添加到allResults 列表中。

    【讨论】:

    • 如何以正确的顺序将 allResults 添加到我的其他 List dataTransfer 中?基本上,allResults 和 dataTransfer 将具有相同数量的条目,但以不同的方式分组。
    • 此外,类似于让 Employee = .FirstOrDefault().ToAsset.AssignedToEmployee,我想要 ConsumptionRate = "some code that links to my allResults"
    • @RFS 如果您想将其添加回您正在使用的列表中,只需这样做,而不是创建allResults 列表。您当前代码的问题是您似乎没有将 FuelConsumptionRateQueryResult result 分配给任何东西。
    • 您提到“只是这样做而不是创建allResults”?我不确定我是否关注
    【解决方案2】:

    通过 LINQ 语句创建附加数据并连接两个列表:

    var results = assetIds.Select(id => FuelConsumptionRateQueryService
                               .Get(id, from, to, AssetCounterType.Odometer);
    dataTransfers = dataTransfers.Concat(results);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2013-07-14
      • 2018-08-11
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多