SqlServer 表包含供应商燃烧的时间和小时数、材料成本的记录
- [IdPK] [日期时间] [材料成本 ] [小时] [Vendor_FK] [Project_FK] [纬度] [长]
用户决定他希望查看总计的回溯距离 以及 哪个列值,即他希望总计返回 - X 个月数,或任何columns_FK过滤器值的 X 周数。
例如,他想要成本的总计,小时数,供应商=耐克或ProjectX,从某个日期开始追溯(1)个月,(3)周或2个月。因此,我正在尝试根据参数化的 Linq 查询获取总计。
问题:
- 使用任何列作为linq中的过滤器/选择器,如何获取成本,小时数的每月/每周总计 - 回溯(X)月数或周数? 另外,我
是否应该为数月与数周编写单独的查询,并为每列编写单独的查询(用户选择的列值作为通用值传递给我)?
// 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 为数据操作提供了非常方便和灵活的工具。这一切都取决于你的幻想。