datatable linq查询

来源:互联网 发布:贴吧人肉软件 编辑:程序博客网 时间:2024/04/30 11:38
本文导读:在平时的工作中,可能有很多情况下要对DataTable的里面的数据进行处理,例如:对DataTable中的某个字段进行排序,根据条件筛选datatable 中的数据,如果能够通过linq对datatable进行查询,则方便很多。

DataTable通过调用AsEnumerable()方法,从而运用Linq查询。其中AsEnumerable方法在System.Data.DataSetExtensions.dll中定义,一般VS会自动引用这个dll。

一、datatable linq查询实例

1. DataTable读取列表

 
C# 代码   复制
DataSet ds = new DataSet();// 省略ds的Fill代码DataTable products = ds.Tables["Product"];IEnumerable<DataRow> rows = from p in products.AsEnumerable()                            select p;foreach (DataRow row in rows){    Console.WriteLine(row.Field<string>("ProductName"));}
 
C# 代码   复制
DataSet ds = new DataSet();// 省略ds的Fill代码DataTable products = ds.Tables["Product"];var rows = products.AsEnumerable()    .Select(p => new    {        ProductID = p.Field<int>("ProductID"),        ProductName = p.Field<string>("ProductName"),        UnitPrice = p.Field<decimal>("UnitPrice")    });foreach (var row in rows){    Console.WriteLine(row.ProductName);}

2. DataTable linq where 查询

 
C# 代码   复制
var rows = products.AsEnumerable()    .Where(p => p.Field<decimal>("UnitPrice") > 10m)    .Select(p => new    {        ProductID = p.Field<int>("ProductID"),        ProductName = p.Field<string>("ProductName"),        UnitPrice = p.Field<decimal>("UnitPrice")    });

3、DataTable linq 数据排序

 
C# 代码   复制
var rows = products.AsEnumerable()    .Where(p => p.Field<decimal>("UnitPrice") > 10m)    .OrderBy(p => p.Field<int>("SortOrder"))    .Select(p => new    {        ProductID = p.Field<int>("ProductID"),        ProductName = p.Field<string>("ProductName"),        UnitPrice = p.Field<decimal>("UnitPrice")    });
 
C# 代码   复制
var expr = from p in products.AsEnumerable()            orderby p.Field<int>("SortOrder")            select p;IEnumerable<DataRow> rows = expr.ToArray();foreach (var row in rows){    Console.WriteLine(row.Field<string>("ProductName"));}
 
C# 代码   复制
var expr = from p in ds.Tables["Product"].AsEnumerable()           orderby p.Field<int>("SortOrder"), p.Field<string>("ProductName") descending           select p;

4、DataTable分组 


C# 代码   复制
var query = from p in ds.Tables["Product"].AsEnumerable()            group p by p.Field<int>("CategoryID") into g            select new            {                CategoryID = g.Key,                Products = g            };foreach (var item in query){    Console.WriteLine(item.CategoryID);    foreach (var p in item.Products)    {        Console.WriteLine(p.Field<string>("ProductName"));    }}

查询Product中每个CategoryID的数目

 
C# 代码   复制
var expr = from p in ds.Tables["Product"].AsEnumerable()           group p by p.Field<int>("CategoryID") into g           select new           {               CategoryID = g.Key,               ProductsCount = g.Count()           };

5、多个DataTable查询

 
C# 代码   复制
var query = from p in ds.Tables["Product"].AsEnumerable()            from c in ds.Tables["Category"].AsEnumerable()            where p.Field<int>("CategoryID") == c.Field<int>("CategoryID")                && p.Field<decimal>("UnitPrice") > 10m            select new            {                ProductID = p.Field<int>("ProductID"),                ProductName = p.Field<string>("ProductName"),                CategoryName = c.Field<string>("CategoryName")            };

二、linq 对象转换为DataTable

通过CopyToDataTable()方法

 
C# 代码   复制
DataTable newD1t = query1.CopyToDataTable<DataRow>();            foreach (DataRow item in newD1t.Rows)            {                System.Console.WriteLine(item["Name"]);            }