• DataTable使用Linq进行分组汇总,将Linq结果集转化为DataTable


    DataTable使用Linq进行分组汇总

      var dt1=dt.AsEnumerable();
    
                        var result1= from r in dt1
                                     group r by new { 
                                         FPJCABASENUMBER = r.Field<string>("FPJCABASENUMBER"),
                                         FMATERIALNUMBER2 = r.Field<string>("FMATERIALNUMBER2") ,
                                         FINVFBaseQty=r.Field<decimal>("FINVFBaseQty"),
                                         FSAFESTOCK = r.Field<decimal>("FSAFESTOCK"),
                                         //FMUSTQTY = r.Field("FMUSTQTY"),
                                         //FQUELIAO = r.Field("FQUELIAO"),
                                         //FPOORECEIVEQTY = r.Field("FPOORECEIVEQTY"),
                                         //FTPINSTOCKFQTY = r.Field("FTPINSTOCKFQTY"),
                                         //FPOPRENOSTOCKQTY = r.Field("FPOPRENOSTOCKQTY"),
                                         //FTPMEFQTY = r.Field("FTPMEFQTY"),
    
                                     }
                                     into m
                                     select new
                                     {
                                         
                                         FPJCABASENUMBER = m.Key.FPJCABASENUMBER,
                                         FMATERIALNUMBER2 = m.Key.FMATERIALNUMBER2,
                                         FINVFBaseQty = m.Key.FINVFBaseQty,
                                         FSAFESTOCK = m.Key.FSAFESTOCK,
                                         FMUSTQTY = m.Sum(x=>x.Field<decimal>("FMUSTQTY")),
                                         FQUELIAO = m.Sum(x=>x.Field<decimal>("FQUELIAO")),
                                         FPOORECEIVEQTY = m.Sum(x=>x.Field<decimal>("FPOORECEIVEQTY")),
                                         FTPINSTOCKFQTY = m.Sum(x=>x.Field<decimal>("FTPINSTOCKFQTY")),
                                         FPOPRENOSTOCKQTY = m.Sum(x=>x.Field<decimal>("FPOPRENOSTOCKQTY")),
                                         FTPMEFQTY = m.Sum(x=>x.Field<decimal>("FTPMEFQTY")),
                                     };
    
                        var resultTable = LINQToDataTable(result1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    将Linq结果集转化为DataTable

    
            /// 
            /// 将IEnumerable类型的集合转换为DataTable类型 
            /// 
            /// 
            /// 
            /// 
            public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
            {   //定义要返回的DataTable对象
                DataTable dtReturn = new DataTable();
                // 保存列集合的属性信息数组
                PropertyInfo[] oProps = null;
                if (varlist == null) return dtReturn;//安全性检查
                                                     //循环遍历集合,使用反射获取类型的属性信息
                foreach (T rec in varlist)
                {
                    //使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
                    if (oProps == null)
                    {
                        oProps = ((Type)rec.GetType()).GetProperties();
                        //循环PropertyInfo数组
                        foreach (PropertyInfo pi in oProps)
                        {
                            Type colType = pi.PropertyType;//得到属性的类型
                                                           //如果属性为泛型类型
                            if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                            == typeof(Nullable<>)))
                            {   //获取泛型类型的参数
                                colType = colType.GetGenericArguments()[0];
                            }
                            //将类型的属性名称与属性类型作为DataTable的列数据
                            dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                        }
                    }
                    //新建一个用于添加到DataTable中的DataRow对象
                    DataRow dr = dtReturn.NewRow();
                    //循环遍历属性集合
                    foreach (PropertyInfo pi in oProps)
                    {   //为DataRow中的指定列赋值
                        dr[pi.Name] = pi.GetValue(rec, null) == null ?
                            DBNull.Value : pi.GetValue(rec, null);
                    }
                    //将具有结果值的DataRow添加到DataTable集合中
                    dtReturn.Rows.Add(dr);
                }
                return dtReturn;//返回DataTable对象
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    C语言----链表
    扩展点系列之ApplicationContextAwareProcessor普通类获取Spring Bean - 第433篇
    matlab数据处理
    (十三) 共享模型之无锁【字段更新器、原子累加器、Unsafe】
    对象数组去重
    奇偶链表问题
    18.透彻理解死锁
    经典文献阅读之--SuMa++
    第2关:ZooKeeper配置
    【map排序 遍历】
  • 原文地址:https://blog.csdn.net/weixin_51803498/article/details/126096555