Linq sum由月份S或周S的可变数量组成

时间:2015-06-12 05:18:02

标签: c# sql-server linq entity-framework

SqlServer表包含刻录的时间和小时数,供应商的材料成本

  • [IdPK] [DateTime] [MaterialsCost] [小时] [Vendor_FK] [Project_FK] [Lat] [长]

用户决定他希望看到总计数 的列值,即他希望总计返回 - 任意columns_FK过滤器值的X个月份, X个周数。

例如他希望总成本,小时数, Vendor = Nike 或ProjectX,从特定日期开始(1)月,(3)周或2个月。所以,我试图根据参数化的Linq查询得到总数。

问题

  1. 在linq中使用任何列作为过滤器/选择器,如何获取每月/每周总成本,小时数 - 返回(X)月数 s 或一周 s
  2. 另外,我应该针对几个月和几周编写单独的查询,并为每个列分别查询(用户选择的列值,作为genric val传递给我)?

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

1 个答案:

答案 0 :(得分:5)

这个问题有点基于意见。你可以用任何方便的方式做到这一点。这就是我如何做到这一点。

首先:您可以使用cat /proc/mounts | grep ^cgroup LINQ函数根据给定的求和规则获取总数。

Sum

第二次:我会对每周和每月的总数进行单独查询,因为&#39;不同实体值的总和,可以有不同的逻辑。

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

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(); LINQ过滤结果。

Where

几个星期和几周:您可以更改DateTime的条件。

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 => // ...);
}

它将显示最后4个月的结果。

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