C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable與Linq相互轉換


LINQ to DataSet需要使用System.Core.dll、System.Data.dll和System.Data.DataSetExtensions.dll,在項目中添加引用System.Data和System.Data.DataSetExtensions。

1. DataTable讀取列表

復制代碼
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"));
}
復制代碼
復制代碼
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);
}
復制代碼
var products = ds.Tables["Product"].AsEnumerable();
var query = from p in products
            select p.Field<string>("ProductName");

2. DataTable查詢

復制代碼
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數據排序

復制代碼
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")
    });
復制代碼
復制代碼
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"));
}
復制代碼
var expr = from p in ds.Tables["Product"].AsEnumerable()
           orderby p.Field<int>("SortOrder"), p.Field<string>("ProductName") descending
           select p;

4. 多個DataTable查詢

復制代碼
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")
            };
復制代碼

5. DataTable分組

復制代碼
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的數目:

復制代碼
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()
           };
復制代碼

 

DataTable與Linq相互轉換

DataTable通過dt.AsEnumerable()方法轉換可用Linq查詢,反之,Linq也可以轉化為DataTable
DataTable newDt = query1.CopyToDataTable<DataRow>();
var query1 =
    from stu in dtStu.AsEnumerable()
    from score in dtScore.AsEnumerable()
    where stu.Field<int>("ScoreID") == score.Field<int>("ScoreID")
    where (int)stu["Age"] > 20
    select stu;


//通過CopyToDataTable()方法創建新的副本
DataTable newDt = query1.CopyToDataTable<DataRow>();
 foreach (var item in newDt.AsEnumerable())  
 {  
     System.Console.WriteLine(item["Name"]);  
}

 

轉:LINQ系列:LINQ to DataSet的DataTable操作

DataTable與Linq相互轉換

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM