当前位置:网站首页>DataTable使用Linq进行分组汇总,将Linq结果集转化为DataTable
DataTable使用Linq进行分组汇总,将Linq结果集转化为DataTable
2022-08-04 04:42:00 【 浊尘】
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<decimal>("FMUSTQTY"),
//FQUELIAO = r.Field<decimal>("FQUELIAO"),
//FPOORECEIVEQTY = r.Field<decimal>("FPOORECEIVEQTY"),
//FTPINSTOCKFQTY = r.Field<decimal>("FTPINSTOCKFQTY"),
//FPOPRENOSTOCKQTY = r.Field<decimal>("FPOPRENOSTOCKQTY"),
//FTPMEFQTY = r.Field<decimal>("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);
将Linq结果集转化为DataTable
/// <summary>
/// 将IEnumerable<T>类型的集合转换为DataTable类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="varlist"></param>
/// <returns></returns>
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对象
}
边栏推荐
猜你喜欢
基于 SSE 实现服务端消息主动推送解决方案
42. 接雨水
2022杭电多校联赛第五场 题解
Learn iframes and use them to solve cross-domain problems
SQL query String field less than 10 how to check
3000 words, is take you understand machine learning!
深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型
Structure function exercise
系统设计.秒杀系统
7-1 LVS+NAT load balancing cluster, NAT mode deployment
随机推荐
技术解析|如何将 Pulsar 数据快速且无缝接入 Apache Doris
Simple operation of the file system
内网服务器访问远程服务器的端口映射
初识Numpy
7-1 LVS+NAT 负载均衡群集,NAT模式部署
如何动态添加script依赖的脚本
FFmpeg —— 通过修改yuv,将视频转为黑白并输出(附源码)
7.LVS负载均衡群集之原理叙述
结构体函数练习
7-2 LVS+DR概述与部署
【技巧】借助Sentinel实现请求的优先处理
Senior PHP development case (1) : use MYSQL statement across the table query cannot export all records of the solution
FFmpeg —— 录制麦克风声音(附源码)
42. 接雨水
缓存穿透、缓存击穿、缓存雪崩以及解决方案
Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析
震惊,99.9% 的同学没有真正理解字符串的不可变性
TL431的基本特性以及振荡电路
JVM笔记
if,case,for,while