DataTable 中的 DataColumn 有一个非常有用的属性 Expression,即公式表达式,利用它可以非常方便的帮助我们完成一些业务需求。
获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。表达式的返回类型由列的 DataType 来确定。
通俗易懂的说:设置了 Expression 之后的列就变成了计算列。
这里介绍一个最简单最经典的场景,抛砖引玉其他更多功能待各位读者自己发现吧!
DataTable 里有两个列分别为每种商品的单价 [Price] 和数量 [Quantity] ,现在需要得到每种商品的总金额 [Amount]。
大家第一时间想到的方案可能是:
增加一列 [Amount],遍历 DataTable 用每一行的 [Price]*[Quantity] 得到总金额,然后赋给列 [Amount],代码如下:
dt.Columns.Add("Amount"); //增加新列存储总金额
foreach(DataRow dr in dt.Rows)
{
dr["Amount"] = decimal.Parse(dr["Price"].ToString()) * decimal.Parse(dr["Quantity"].ToString());
}
另外需要考虑每次修改了数量或单价时都要自己写代码重新计算金额,当然如果写习惯了可能会认为这是理所当然要做的,并且只能这样做。
dt.Columns.Add("Amount","Price * Quantity");
如你所见,仅此而已。
其中方法第二个参数就是 Expression,指定了一个用于计算的表达式,之后的计算逻辑完全由 DataTable 实现,不需要我们手动干预。
需要注意的是:对于设置了 Expression 的计算列,我们不能再使用代码主动进行赋值。
表达式中可用的函数如 Like、IsNull、IIF、SubString、Len 等都是可以的,详细用法请参考官方文档。
官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datacolumn.expression
使用案例:
在编写 [鲁丰织布 - 计划管理 - 编制整经计划] 模块的合批方案部分代码时就用到了 Expression,大家有兴趣可以参考一下。
最后,我不想说其实 DevExpress 的 Grid 也有它的计算列,会不会功能更强大?
我不说~有心的人自己会懂~