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. Mac 系统安装教程

    上周末买了一个二手的Mac,当时是抹掉整个硬盘的,所以只能选择重装系统了.但是,多次重装都是失败了.最后使用USB安装,试了好几次,误打误撞总算成功了. 下面是整个安装的教程: 1. 备份好所有的私人 ...

  2. Android开发之如何避免ANR(Keeping Your App Responsive)

    一:什么是ANR 如果应用程序不能响应用户的输入了,那么就可以说应用ANR了. 如果需要运行一个耗时较长的操作的时候,不要把这个任务放在UI线程上运行,而是单独创建一个线程运行那些操作. 以下情况会出 ...

  3. Java定时任务解决方案

    很多项目中都会遇到需要定时任务的情况,本篇文章就结合了Spring中以及SpringBoot.SpringCloud中定时任务的解决方案. 在Spring中使用定时器 用SpringBoot比较多的同 ...

  4. IntelliJ IDEA 的下载和安装

    下载 官网地址:https://www.jetbrains.com/idea/ 直接点击 DOWNLOAD 下载 接下来跳转到一个页面,可以看到第一个红框中是选择操作系统的,IDEA分为收费的旗舰版和 ...

  5. C#中四步轻松使用log4net记录本地日志(WPF有点小区别)

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  6. [Swift-2019力扣杯春季初赛]1. 易混淆数

    给定一个数字 N,当它满足以下条件的时候返回 true: 把原数字旋转180°以后得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, 1, 9, 8, 6 . ...

  7. hadoop基础与实践--流程解惑

    看过好多本hadoop的书,对整个过程始终存在一些疑问,今天终于搞清楚了.立个low-flag. 整体架构好复杂的感觉?其实不复杂 整体架构,namenode/metanode负责维护所有的元数据,d ...

  8. core跨域问题

    #region 跨域问题 app.UseCors(builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() ...

  9. 数字(Number)类型(一)

    多行语句 Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句,例如: total = item_one + \ item_two + \ item_three ...

  10. java开发个人简历

    求职意向 Java开发工程师 陈 楠 性 别:男 出生年月 :1995.07 民 族:汉族 联系方式 :159-3306-7520 学 历:本科 电子邮件 :15933067520@163.com 教 ...