You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:36:03