Linq 总和按可变的月数或周数



SqlServer 表包含供应商燃烧的时间和小时数、材料成本的记录

  • [IdPK] [日期时间] [材料成本
  • ] [小时] [Vendor_FK] [Project_FK] [纬度] [长]

用户决定他希望查看总计的回溯距离 以及 哪个列值,即他希望总计返回 - X 个月数,或任何columns_FK过滤器值的 X 周数。

例如,他想要成本的总计,小时数,供应商=耐克或ProjectX,从某个日期开始追溯(1)个月,(3)周或2个月。因此,我正在尝试根据参数化的 Linq 查询获取总计。

问题

  1. 使用任何列作为linq中的过滤器/选择器,如何获取成本,小时数的每月/每周总计 - 回溯(X)月数或周数?
  2. 另外,我
  3. 是否应该为数月与数周编写单独的查询,并为每列编写单独的查询(用户选择的列值作为通用值传递给我)?

     // I tried this... but just stuck
     DateTime now = DateTime.Now;
     Int goBack = passedinGoingBack;  // amount of units to go back
     var backUnits = obj.GetType().GetProperty(name); // tried getting month or week??
     var getRows = table.AsEnumerable()
     var columnName = passedInColumnName;
     var filter = passedInValue;
    .Where(r =>  r.Field<DateTime>(columnName).Year  == now.Year
              && r.Field<DateTime>(columnName).Month == now.Month);
    
这个问题

有点基于意见。你可以用任何方便的方式去做。这就是我会这样做的方式。

首先:您可以使用Sum LINQ函数根据给定的求和规则获取总计。

var monthlyRows = table.AsEnumerable()
           .Where(r => r.Field<DateTime>("ColumnName").Year == now.Year 
                    && r.Field<DateTime>("ColumnName").Month == now.Month);
var monthlyTotalForCost = monthlyRows.Sum(r => r.Field<decimal>("CostColumn"));
var monthlyTotalForHours = monthlyRows.Sum(r => r.Field<decimal>("HoursColumn"));
var weeklyRows = table.AsEnumerable()
           .Where(r => r.Field<DateTime>("ColumnName").Year == now.Year 
                    && r.Field<DateTime>("ColumnName").Week == now.Week);
var weeklyTotalForCost = monthlyRows.Sum(r => r.Field<decimal>("CostColumn"));
var weeklyTotalForHours = monthlyRows.Sum(r => r.Field<decimal>("HoursColumn"));

第二:我会对每周和每月总计进行单独的查询,因为这是不同实体值的总和,并且可能有不同的逻辑。

但是,我会像这样为我做一个帮助功能:

public static class TableLinqHelper
{
    public static SumOfTableColumn<T>(this IEnumerable<DataRow> rows, string columnName)
    {
        return rows.Sum(r => r.Field<T>(columnName));
    }
    public static DateTime GetDate(this DataRow row)
    {
        return row.Field<DateTime>("DateColumn");
    }
    public static GetTotalForCost(this IEnumerable<DataRow> row)
    {
        return SumOfTableColumn<decimal>(row, "CostColumn");
    }
    public static GetTotalForHours(this IEnumerable<DataRow> row)
    {
        return SumOfTableColumn<double>(row, "HoursColumn");
    }
}
var monthlyRows = table.AsEnumerable()
           .Where(r => r.GetTime().Year == now.Year 
                    && r.GetTime().Month == now.Month);
var weeklyRows = table.AsEnumerable()
           .Where(r => r.GetTime().Year == now.Year 
                    && r.GetTime().Week == now.Week);

var monthlyTotalForCost = monthlyRows.GetTotalForCost();
var monthlyTotalForHours = monthlyRows.GetTotalForHours();
var weeklyTotalForCost = weeklyRows.GetTotalForCost();
var weeklyTotalForHours = weeklyRows.GetTotalForHours();

更新:

筛选:可以使用 Where LINQ 筛选结果。

Dictionary<string, object> Filters = new Dictionary<string, object>();
Filters.Add("VendorColumn", "Nike");
Filters.Add("Hours", 7.0);
foreach (var filter in Filters)
{
   monthlyRows = monthlyRows.Where(r => // ...);
}

几个月和几周:您可以在何处更改日期时间的条件。

int rowsToBeShown = 4;
var monthlyRows = table.AsEnumerable()
    .Where(r => r.Field<DateTime>("ColumnName") > DateTime.Now.AddMonths(-rowsToBeShown));

它将显示过去 4 个月的结果。

LINQ 为数据操作提供了非常方便和灵活的工具。这一切都取决于你的幻想。

相关内容

  • 没有找到相关文章

最新更新