C# SQL开发:如何为表列每个distinct值执行PDF生成业务代码
实现方案及问题解答
- 关于PDF创建方法的调用位置:不需要嵌套在现有遍历DataRow的循环中,你可以在所有数据全部加载到
ObservableCollection完成之后,新增一层循环遍历分组后的公司集合即可,既能拿到每家公司的全量明细数据,也不会重复触发PDF生成逻辑。 - 关于
CompanyName列名的引用:非常建议使用列名替代当前的数字索引取值,数字索引强依赖存储过程返回字段的固定顺序,后续如果存储过程调整返回字段顺序很容易出现取值错误的问题。替换操作很简单,把原来的dr[1].ToString()修改为dr["CompanyName"].ToString()即可,其他字段也可以同步替换为列名取值,提升代码可维护性。 - 关于唯一公司去重执行逻辑:你可以用LINQ的
GroupBy方法对加载完成的ObservableCollection按CompanyName字段分组,每个分组就对应一个唯一的公司,遍历分组后的结果调用PDF生成方法,就能保证每个不同的公司仅执行一次生成逻辑。
修改后的完整代码示例如下:
// 注意如果提示GroupBy不存在,请在文件头部添加 using System.Linq; try { using (SqlConnection con = new(/*你的数据库连接字符串*/)) using (SqlCommand cmd = new("spMyStoredProcedure", con) { CommandType = CommandType.StoredProcedure }) using (SqlDataAdapter da = new(cmd)) using (DataSet ds = new()) { con.Open(); da.Fill(ds); // 加载全量数据到ObservableCollection foreach (DataRow dr in ds.Tables[0].Rows) { MyObservableCollection.Add(new MyClass { ID = (int)dr["ID"], CompanyName = dr["CompanyName"].ToString(), Value1 = (decimal)dr["Value1"], Value2 = (decimal)dr["Value2"], Value3 = (decimal)dr["Value3"], }); } // 按公司名称分组,得到所有唯一公司的分组集合 var companyGroups = MyObservableCollection.GroupBy(item => item.CompanyName); // 遍历每个分组生成对应PDF foreach (var companyGroup in companyGroups) { // companyGroup.Key为当前唯一的公司名称,companyGroup.ToList()为该公司的所有明细数据 你的PDF生成方法(companyGroup.Key, companyGroup.ToList()); } } } catch (Exception ex) { // 按需添加异常处理逻辑 }
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

