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的更多相关文章

  1. 如何使用linq操作datatable进行分组

    使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...

  2. C# 中 Linq 操作 DataTable

    方法一:更简洁 Console.WriteLine(dt.Rows.OfType<DataRow>().First(x => x.Field<string>(" ...

  3. Linq操作DataTable

    IEnumerable<DataRow> q = from dr in dt.AsEnumerable()                          where dr.Field& ...

  4. 关于Linq对DataTable和List各自的两个集合筛选的相关操作技巧

    项目中用到了对两个集合的帅选等操作,简单总结下 1.Linq操作多个Datable 可以通过AsEnumerable()方法对DataTable进行Linq操作 //获取数据表所有数据 DataTab ...

  5. XML系列之--Linq操作带属性的XML(四)

    关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...

  6. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

  7. Linq操作非泛型集合

    我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...

  8. 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...

  9. 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题

    2013-8-5 1 Linq解决DataTable按照某一列的值排序 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的 ...

随机推荐

  1. 包建强的培训课程(12):iOS深入学习(内存管理、Block和GCD等)

    @import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=Syn ...

  2. Android 代码混淆配置总结

    一.前言 为何需要混淆呢?简单的说,就是将原本正常的项目文件,对其类,方法,字段,重新命名,a,b,c,d,e,f…之类的字母,达到混淆代码的目的,这样反编译出来,结构乱糟糟的,看了也头大. 另外说明 ...

  3. HTML5与CSS3权威指南笔记案例1

    第1章 <!DOCTYPE html> <meta charset = "UTF-8"> <title> Search </title&g ...

  4. mouseover和mouseenter,mouseout和mouseleave的区别-引发的探索

    相信小伙伴们都用过鼠标事件,比如mouseover和mouseout,mouseenter和mouseleave.它们都分别表示鼠标移入移出. 在使用的过程中,其实一直有个小疑问——它们之间究竟有什么 ...

  5. Maven私服nexus

    部署私服 xenus  下载https://www.sonatype.com/download‐oss‐sonatype 我下载了两个版本的nexus: nexus-3.13.0-01-unix.ta ...

  6. multiprocessing- 基于进程的并行性

    介绍 multiprocessing是一个使用类似于threading模块的API支持生成进程的包.该multiprocessing软件包提供本地和远程并发,通过使用子进程而不是线程有效地支持 全局解 ...

  7. 动态dp初探

    动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...

  8. 给iPhone手机安装*.ipa

    首先手机连接电脑,打开 ITunes. 左上角点击文件,再点击添加到资料库. 找到你要安装的ipa点击选择打开 好了ipa已经添加进去后,你会看你你刚才添加进去的应用在列表内,点击左上角一个手机的图标 ...

  9. java提高(4)---数组增删 list删除 map删除

    数组增删 集合删除 一.数组增删 package com.test; import java.util.List; import java.util.ArrayList; import java.ut ...

  10. python+appium的物理按键代码

    代码就一句driver.keyevent()括号内填入的是物理按键的数字代号 代号表: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOM ...