LINQ 查询适用于实现的数据源 IEnumerable<T>接口或System.Query.IQueryable接口。

DataTable类默认是没有实现以上接口的。

所以要在DataTable中使用LINQ查询,需要调用一下AsEnumerable方法,返回一个EnumerableRowCollection<DataRow>集合。

实例如下所示:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms; namespace DataTableToList
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private DataTable GetTable()
{
int[] id = { 4, 5, 1, 3, 2, 7, 6 };
string[] name = { "Tom", "Jack", "Jime", "Lilei", "Jimo", "Koko", "Luoyi" };
DataTable table = new DataTable("Student");
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string)); for (int i = 0; i < id.Length; i++)
{
table.Rows.Add(new object[] { id[i], name[i] });
} return table;
}
//order by
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = GetTable();
var students = dt.AsEnumerable(); //排序
var result = students.OrderBy(x => x.Field<int>("ID"));
//输出
this.listBox1.Items.Clear();
foreach (DataRow row in result)
{
this.listBox1.Items.Add("order by=="+row["ID"].ToString() + "==" + row["Name"].ToString());
}
}
//where
private void btnWhere_Click(object sender, EventArgs e)
{
DataTable dt = GetTable();
var students = dt.AsEnumerable();
//排序
var result = students.Where(x => x.Field<int>("ID") > 3);
//输出
this.listBox1.Items.Clear();
foreach (DataRow row in result)
{
this.listBox1.Items.Add("where=="+row["ID"].ToString() + "==" + row["Name"].ToString());
}
} private void btnToList_Click(object sender, EventArgs e)
{
DataTable dt = GetTable();
var students = dt.AsEnumerable();
List<Student> list = students.Select
(
x => new Student
{
ID = x.Field<int>("ID"),
Name = x.Field<string>("Name")
}
).ToList(); this.listBox1.Items.Clear();
foreach (Student item in list)
{
this.listBox1.Items.Add("tolist=="+item.ID + "==" + item.Name);
}
} } public class Student
{
public int ID { get; set; }
public string Name { get; set; }
}
}

运行效果如下:

方式二:

/// <summary>
/// DataTable转成List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> DataTableToList<T>(this DataTable dt)
{
var list = new List<T>();
var plist = new List<PropertyInfo>(typeof(T).GetProperties());
foreach (DataRow item in dt.Rows)
{
T s = Activator.CreateInstance<T>();
for (int i = 0; i < dt.Columns.Count; i++)
{
PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
if (info != null)
{
try
{
if (!Convert.IsDBNull(item[i]))
{
object v = null;
if (info.PropertyType.ToString().Contains("System.Nullable"))
v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
else v = Convert.ChangeType(item[i], info.PropertyType);
info.SetValue(s, v, null);
}
}
catch (Exception ex)
{
throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
}
}
}
list.Add(s);
}
return list;
}

  

DataTable To List<T> DataTable Linq学习笔记的更多相关文章

  1. linq学习笔记

    最近在学习linq的一些基础知识,看了c#高级编程及阅读了园子内部几篇优秀的博文,有所体会,感觉应该记录下来,作为以后复习使用.都是一些最基础的知识,大致分为三个部分:linq预备知识:linq查询: ...

  2. (转)Linq学习笔记

    写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...

  3. C#之Linq学习笔记【转】

    写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...

  4. C# Linq 学习笔记

    刚刚学习了 Siki老师 的C#教程Linq部分,以下是笔记 需要引用命名空间 using System.Linq; 然后我们需要准备数据 武林高手类 /// <summary> /// ...

  5. C# LINQ学习笔记一:走进LINQ的世界

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用. LINQ 简介:     语言集成查询(LINQ)是Vi ...

  6. LINQ 学习笔记(1)

    学习资源参考 : http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 常用方法是 Where, OrderBy, Selec ...

  7. C# LINQ学习笔记五:LINQ to XML

    本笔记摘抄自:https://www.cnblogs.com/yaozhenfa/p/CSharp_Linq_For_Xml.html,记录一下学习过程以备后续查用. 一.生成xml 1.1创建简单的 ...

  8. C# LINQ学习笔记四:LINQ to OBJECT之操作文件目录

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5816051.html,记录一下学习过程以备后续查用. 许多文件系统操作实质上是查询,因此非常适合使用LINQ方 ...

  9. C# LINQ学习笔记三:LINQ to OBJECT之操作字符串

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5814204.html,记录一下学习过程以备后续查用. 一.统计单词在字符串中出现的次数 请注意,若要执行计数, ...

随机推荐

  1. Fidessa

    Fidessa这样为券商提供交易系统和与交易所连接的公司被称作Independent Software Vendor, 同类的还有FIS(前SunGuard), Bloomberg(AIM), Tho ...

  2. centos6.5 单点kafka测试

    一,kafka解压到/usr/local/下后,修改配置文件 vim config/zookeeper.properties 修改如下几行: dataDir=/usr/local/zookeeper/ ...

  3. 【ABAP系列】SAP ABAP 为表维护生成器创建事务代码

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 为表维护生成器 ...

  4. 日常小节----unity小坑记(静态后不可移动和旋转)

    当物体被置为静态时,模型网格是无法移动和旋转的,只有碰撞器可以. 也就是会出现当父物体不为静态,子物体为静态时,运行后旋转移动父物体,子物体模型网格不会跟随旋转移动,但子物体碰撞器会跟随旋转移动. 或 ...

  5. 加入域之后,【Internet 时间】选项没有了

    这是加入域之前的截图,这时可以看见[Internet 时间]选项. 这是加入域之后的截图,这时就看不到[Internet 时间]选项了. 那这到底是为什么呢?别急,结合概念一看就明白啦. NTP全称网 ...

  6. Element ui 2.8版本中的table树不能默认全展开解决方法

    方案一:这个方案有问题 <el-table ref="tableTreeRef" :data="tableDate" ...... </el-tab ...

  7. centos7 的system

    1.vim /etc/systemd/system/alertmanager.service [Unit] Description=Alertmanager After=network-online. ...

  8. 第五周课程总结&试验报告(三)

    第五周课程总结&试验报告(三) 实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 ###1.已知字符串:"this is a ...

  9. Daily Temperatures

    Given a list of daily temperatures T, return a list such that, for each day in the input, tells you ...

  10. 【Python】【demo实验28】【练习实例】【递归函数练习】

    原题: 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他说是10岁.请 ...