Linq 操作DataTable
class ClientStruct
{
public string ID = "ID";
public string Name = "Name";
public string Company = "Company";
public string CreatedDate = "CreatedDate";
}
public string[,] infoArr = new string[,] { { "", "百度", "baidu", "" }, { "", "迅雷", "xunlei", "" }, { "", "谷歌", "guge", "" } };
protected void LinqDataTable()
{
DataRow row;
ClientStruct cs = new ClientStruct();
DataTable dtTable = new DataTable();
dtTable.Columns.Add(cs.ID);
dtTable.Columns.Add(cs.Name);
dtTable.Columns.Add(cs.Company);
dtTable.Columns.Add(cs.CreatedDate);
for (int i = ; i < ; i++)
{
row = dtTable.NewRow();
row[cs.ID] = infoArr[i, ];
row[cs.Name] = infoArr[i, ];
row[cs.Company] = infoArr[i, ];
row[cs.CreatedDate] = infoArr[i, ];
dtTable.Rows.Add(row);
} //遍历DataTable,取出所有的ID
List<string> lstID = (from d in dtTable.AsEnumerable()
select d.Field<string>(cs.ID)).ToList<string>(); //遍历DataTable,将其中的数据对应到ClientStruct中:
List<ClientStruct> list = (from x in dtTable.AsEnumerable()
orderby x.Field<string>(cs.Company)
select new ClientStruct
{
ID = x.Field<string>(cs.ID),
Name = x.Field<string>(cs.Name),
Company = x.Field<string>(cs.Company),
CreatedDate = x.Field<string>(cs.CreatedDate)
}).ToList<ClientStruct>(); //遍历DataTable,并将上面的List结果存储到Dictionary中:
Dictionary<string, ClientStruct> dic = list.ToDictionary(p => p.Company);
//p作为string键值来存储
}
其实关键是AsEnumerable()方法,返回一个 System.Collections.Generic.IEnumerable<T> 对象
误区:
一:
var dd=from DataRow r in dt.Rows select r ;
foreach (var item in dd)
{
var hh = item;
}
二:
var dtrows = dt.Rows.Cast<DataRow>();
var aaaaaa = dtrows.ToList();
本来认为通过以上两种方式可以方便的得到 列以及对应的值 方便序列化成json
调试:

结果并非想象的 列名 对应相应的值 其中ItemArray中只是对应的值 没中对应的列名
Table是原始的得到的DataTable数据 即使通过linq进行过滤 也没用 里面仍然是原始数据
dd.Skip(pagination.rows * (pagination.page - )).Take(pagination.rows);
所以不要想着通过这种方式来 对DataTable进行分页 然后序列换json 在前台通过Grid进行显示,因为序列化的结果并不是 列名:值 的json数据。
实战:
public string GetListJson(Pagination pagination, string keyword, string F_EtId,
string F_CreatorTime_Start, string F_CreatorTime_End, string F_CreatorUserId)
{ string sql = string.Format(@"
WITH AA AS(
SELECT rec.F_ResUnit,rec.F_ResUnitID,
COUNT(0) AS zongliang,
SUM(CASE WHEN item.F_EvalState<>'4' THEN 1 ELSE 0 END) AS weizhenggai,
SUM(CASE WHEN item.F_EvalState='4' THEN 1 ELSE 0 END) AS yichuli,
SUM(CAST(item.F_DedScore AS DECIMAL(18,1))) AS koufeizhi
FROM dbo.T_EvalReportItem item
INNER JOIN dbo.T_EvalDutyRec rec
ON rec.F_ERIFId=item.F_Id
INNER JOIN dbo.T_EvalReport report
ON report.f_id=item.F_ERId AND report.F_EvalType='1'--派单类
GROUP BY rec.F_ResUnit,F_ResUnitID
)
SELECT unit.F_Code,unit.F_ResUnit,unit.F_UnitType,
CASE WHEN AA.zongliang IS NULL THEN 0 ELSE AA.zongliang END zongliang,
CASE WHEN AA.yichuli IS NULL THEN 0 ELSE AA.yichuli END yichuli,
CASE WHEN AA.weizhenggai IS NULL THEN 0 ELSE AA.weizhenggai END weizhenggai,
CASE WHEN AA.koufeizhi IS NULL THEN 0 ELSE AA.koufeizhi END koufeizhi,
CASE WHEN AA.zongliang IS NULL THEN 0 ELSE CAST((CAST(yichuli AS DECIMAL(18,2))/zongliang) AS DECIMAL(18,4)) END baifeibi
--百分比
FROM T_ResponsibilityUnit unit
LEFT JOIN AA
ON AA.F_ResUnitID = unit.F_Code
");
DataTable dt = new DataTable();
dt = DbHelper.GetTable(sql);
var data =
from item in dt.AsEnumerable().Skip(pagination.rows*(pagination.page - )).Take(pagination.rows)
select new
{
F_Code = item.Field<string>("F_Code"),
F_ResUnit = item.Field<string>("F_ResUnit"),
F_UnitType = item.Field<string>("F_UnitType"),
zongliang = item.Field<int>("zongliang"),
yichuli = item.Field<int>("yichuli"),
weizhenggai = item.Field<int>("weizhenggai"),
koufeizhi = item.Field<object>("koufeizhi"),
baifeibi = item.Field<object>("baifeibi")
};
pagination.records = dt.Rows.Count;
var dataList = new
{
rows = data.ToList(),
total = pagination.total,
page = pagination.page,
records = pagination.records
};
//IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(dr => dr["A"].ToString());//按A分组
return dataList.ToJson();
}
转自:http://blog.csdn.net/joyhen/article/details/8717552
Linq 操作DataTable的更多相关文章
- 如何使用linq操作datatable进行分组
使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...
- C# 中 Linq 操作 DataTable
方法一:更简洁 Console.WriteLine(dt.Rows.OfType<DataRow>().First(x => x.Field<string>(" ...
- Linq操作DataTable
IEnumerable<DataRow> q = from dr in dt.AsEnumerable() where dr.Field& ...
- 关于Linq对DataTable和List各自的两个集合筛选的相关操作技巧
项目中用到了对两个集合的帅选等操作,简单总结下 1.Linq操作多个Datable 可以通过AsEnumerable()方法对DataTable进行Linq操作 //获取数据表所有数据 DataTab ...
- XML系列之--Linq操作带属性的XML(四)
关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- Linq操作非泛型集合
我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题
2013-8-5 1 Linq解决DataTable按照某一列的值排序 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的 ...
随机推荐
- 双十一福利,阿里云1核2G一年最低只要99
活动期间,新用户可任选1款购买,限购1台,拼团后团内每增加1名新购用户,全团再享10%优惠 (50%封顶),买贵返差 又是只给新用户的福利,比上次的699一年的活动要差一点.如果之前注册了没下手的用户 ...
- Android开发技术周报182学习记录
Android开发技术周报182学习记录 教程 App安全二三事 记录 为什么要安全 App的移动安全主要包括下面几种: 密钥破解,导致本地加密数据被盗取. 通信密钥破解,导致接口数据被盗取. 伪造接 ...
- H5新增属性contenteditable(不用JS,实现div模拟textarea高度自增长)
无意中看到一篇博客介绍了contenteditable这个属性——不需用JS,只需在div里加上contenteditable="true",即可实现div模拟textrarea( ...
- Kali学习笔记11:僵尸扫描案例
什么是僵尸扫描?本质也是端口扫描,不过是一种极其隐蔽的扫描方式 所以几乎不会被发现,不过也有着很大缺陷:扫描条件很高 首先需要有一台僵尸机,这里我找好一台win10僵尸机器,IP地址为:10.14.4 ...
- SpringCache实战遇坑
1. SpringCache实战遇坑 1.1. pom 主要是以下两个 <dependency> <groupId>org.springframework.boot</g ...
- Ubuntu 16.04 系统无法挂载u盘的问题
Ubuntu系统无法挂载U盘设备,提示错误为:mount:未知文件系统类型“exfat”.这是因为Ubuntu默认情况下是不允许挂载U盘的,想在Ubuntu系统下挂载U盘,就要用下面的方法了. sud ...
- CSS Modules 与 scoped 的不一样
What ? css 的作用域表现. Css modules 是一个CSS文件,其中所有类名和动画名称默认为局部作用域. 使用JS编译原生的CSS文件,使其具备模块化的能力,该文件需要import使用 ...
- 9102年了,汇总下HttpClient问题,封印一个
如果找的是core的HttpClientFactory 出门右转. 官方写法,高并发下,TCP连接不能快速释放,导致端口占完,无法连接 Dispose 不是马上关闭tcp连接 主动关闭的一方为什么不能 ...
- iReport 5.6.0 安装包下载&安装
iReport 5.6.0 下载 方式有两种: 1.在官网社区上下载,下载地址:https://community.jaspersoft.com/project/ireport-designer/re ...
- [P4721] 分治 FFT
「题意」给定\(g[0]=1\),\(g[1~n-1]\)求序列\(f[i]=\sum_{j=1}^i f[i-j]*g[j]\ , i\in[1,n-1],f[0]=1\). 「分析」分治处理区间[ ...