C#中LINQ to DataSet操作及DataTable与LINQ相互转换

一、DataTable的扩展方法:

1、DataTable转Linq:AsEnumerable 方法

返回的EnumerableRowCollection<DataRow> 实现了 IEnumerable<T>接口。其中泛型参数T是DataRow。

此对象可用在 LINQ表达式或方法查询中。

语法:

public static EnumerableRowCollection<DataRow> AsEnumerable (this DataTable source);

在以下示例中,一个 DataColumn 数据表ProductName,提取ProductName值,然后将值输出。

DataTable table = new DataTable();
table.Columns.Add("ID");
table.Columns.Add("ProductName");

table.Rows.Add("1", "Chai");
table.Rows.Add("2", "Queso Cabrales");
table.Rows.Add("3", "Tofu");

var productNames = from products in table.AsEnumerable()
                   select products.Field<string>("ProductName");
Console.WriteLine("Product Names: ");
foreach (string productName in productNames)
{
    Console.WriteLine(productName);
}

注意:转成EnumerableRowCollection后,需要对两个这样的行集合进行操作,如:Distinct,Union,Except,Intesect,SequenceEqual都需要对数据源的元素进行相等比较,需要使用专门为Linq To Datatable新增加的DataRowComparer作为参数(实现了IEqulityComparer接口),用于比较DataRow的值(而不是引用比较)。否则,根本不能达到预期操作。

IEnumerable<DataRow> distinctTable = table.AsEnumerable().Distinct(DataRowComparer.Default);

2、Linq转DataTable

(1)返回DataTable,其中包含的副本DataRow对象。

public static DataTable CopyToDataTable<T> (this IEnumerable<T> source) where T : DataRow;

以下示例查询 SalesOrderHeader 表的订单后 2001 年 8 月 8 日,并使用CopyToDataTable方法来创建DataTable从该查询。

DataTable orders = ds.Tables["SalesOrderHeader"];

IEnumerable<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

(2)副本表的DataRow到指定的对象DataTable。

public static void CopyToDataTable<T> (this IEnumerable<T> source, DataTable table, LoadOption options) where T : DataRow;

LoadOption:当使用 Load 或 Load 方法时控制数据源中的值如何应用至现有行。

  • OverwriteChanges:传入此行的值将同时写入每列数据的当前值和原始值版本。
  • PreserveChanges:传入此行的值将写入每列数据的原始值版本。 每列数据的当前版本不变化。 这是默认设置。
  • Upsert:传入此行的值将写入每列数据的当前版本。 每列数据的原始版本不变化。

以下示例:如果tableold表设置了主键,则可以合并记录,否则追加。

table.AsEnumerable().CopyToDataTable(tableold,LoadOption.OverwriteChanges);

tips:默认情况下(没对表进行操作),数据行的Original版本是不存在的,视图访问将报错。可以在访问之前使用DataRow.HasVersion来判断,也可以通过调用DataRow.AcceptChanges()方法来建立Original版本,避免异常发生。

二、DataRow中的扩展方法:

(1)获取字段值

Field:提供对 DataRow 中的每个列值的强类型访问。

public static T Field<T> (this DataRow row, string columnName);

举例:

foreach (DataRow row in table.AsEnumerable())
{
    row.Field<int>("Id");
    row.Field<string>("Name", DataRowVersion.Original);
}

(2)设置字段值

Set​Field:为 DataRow 中的指定列设置一个新值。

public static void SetField<T> (DataRow row, string columnName, T value);

如果value是null,则SetField方法转换null值设置为DBNull.Value。

举例:

var rows = from s in table.AsEnumerable()
           where s.Field<string>("Name") == "c"
           select s;
rows.Single<DataRow>().SetField("Name", "cc");

三、Linq To DataTable的常见用法。

1、查询:

DataTable table = new DataTable();
table.Columns.Add("ID", Type.GetType("System.Int32"));
table.Columns.Add("PID", Type.GetType("System.Int32"));
table.Columns.Add("CreateDate", Type.GetType("System.DateTime"));

table.Rows.Add(1, 2, "2010-1-1");
table.Rows.Add(2, 3, "2011-1-1");
table.Rows.Add(3, 3, "2012-1-1");
table.Rows.Add(4, 2, null);

var rows = from s in table.AsEnumerable()
           where s.Field<int>("ID") > 1 && !s.IsNull("CreateDate")
           select new
           {
               ID = s["ID"],
               CreateDate = s["CreateDate"]
           };
rows.ToList().ForEach(m => Console.WriteLine(m.ID + "-" + m.CreateDate));//2-2011-01-01 0:00:00 3-2012-01-01 0:00:00

2、分组:

var query = from r in table.AsEnumerable()
            group r by new
            {
                PID = r.Field<int>("PID")
            } into g
            select new
            {
                Pid = g.Key.PID,
                FirstCreateDate = g.First().Field<DateTime>("CreateDate"),
                IDS = string.Join(",", g.Select(n => n.Field<int>("ID")).ToArray()),
                Count = g.Count(q => q.Field<int>("ID") > 1),
                Sum1 = g.Sum(q => q.Field<int>("ID"))
            };
query.ToList().ForEach(m => Console.WriteLine(m.Pid + "-" + m.FirstCreateDate + "-" + m.IDS));//2-2010-01-01 0:00:00-1,4      3-2011-01-01 0:00:00-2,3

例2:按PID分组,获取倒数第二条信息

var query1 = from r in table.AsEnumerable()
             where new int[] { 3, 4 }.Contains(r.Field<int>("PID"))
             orderby r.Field<DateTime>("CreateDate") descending
             group r by r.Field<int>("PID") into g
             let n = (from d in g.Take(2).Skip(1) select d).FirstOrDefault()
             select new
             {
                 PID = g.Key,
                 ID = n.Field<int>("ID"),
                 CreateDate = n.Field<DateTime>("CreateDate")
             };
query1.ToList().ForEach(m => Console.WriteLine(m.PID + "-" + m.ID + "-" + m.CreateDate));//3-2-2011-01-01 0:00:00

3、Join组合查询:

var result = from t1 in table.AsEnumerable()
             join t2 in table.AsEnumerable() on
             t1.Field<int>("ID") equals t2.Field<int>("ID")
             where t2.Field<DateTime?>("CreateDate") < DateTime.Today || !t2.Field<DateTime?>("CreateDate").HasValue
             select new
             {
                 ID = t2.Field<int>("ID"),
                 CreateDate = t1.Field<DateTime?>("CreateDate")
             };
result.ToList().ForEach(m => Console.WriteLine(m.ID + "-" + m.CreateDate));

到此这篇关于C#中LINQ to DataSet操作及DataTable与LINQ相互转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# Linq延迟查询的执行实例代码

    C# Linq延迟查询 在定义linq查询表达式时,查询是不会执行,查询会在迭代数据项时运行.它使用yield return 语句返回谓词为true的元素. var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" }; var namesWithJ = from n in names where n.Sta

  • Linq中ToList()和CopyToDataTable()用法详解

    最近在项目中使用了Linq,想把Linq的查询结果直接转换成DataTable对象,通过查找发现Linq有一个CopyToDataTable<T>的泛型方法,该方法只能在T是DataRow的情况下使用,发现了这个方法以后就直接在项目中使用了,但是在使用的过程中发现,如果Linq的查询结果不包含任何DataRow对象的时候,使用CopyToDataTable()方法会报错,代码如下: using System; using System.Collections.Generic; using Sy

  • c# Linq查询详解

    c#提供的ling查询极大的遍历了集合的查询过程,且使用简单方便,非常的有用. 下面将分别用简单的例子说明:ling基本查询.延迟查询属性.类型筛选.复合from字句.多级排序.分组查询.联合查询.合并.分页.聚合操作符.并行linq.取消长时间运行的并行ling查询. Lambda表达式简介: /*Lambda表达式:Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数 表达式位于 => 运算符右侧的 lambda 表达式称为"表达式 lambda". * (i

  • C# LINQ查询表达式及对应LAMBDA表达式的用法

    C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美之处不仅仅是语法糖方面还有就是体现在LINQ和Lambda表达式. 本篇文简单介绍一下关于C#当中LINQ表达式和其对应的Lambda表达式的用法,关于这两部分内容的相关参考资料: 人民邮电出版社<C#程序设计及应用教程>(第3版) 博客:<c# Linq查询> 同时在介绍的时候我会尽

  • C# LINQ的基本使用方法示例

    LINQ是什么? LINQ是Language Integrated Query(语言集成查询的缩写), 微软官方 对其的描述: 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 基本用法是什么? (我目前也只会最基本的用法..) LINQ查询操作由三个不同的操作组成: 获取数据源 创建查询 执行查询 下面我将用我学习时用的一个小例子来演示. 有两个数据源:武林高手的集合和武林绝学的集合. 我用的是两个集合,实际上不只是集合可以作为数据源 微软官方文档提到: 上例中

  • 全面分析c# LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的语言而只是在现有的语言基础上来实现,所以叫语言集成查询. 一些基础 在 C# 中,从功能上 LINQ 可分为两类:LINQ to Object 和 L

  • 如何使用LinQ To Object把数组或DataTable中的数据进行向上汇总

    最近搞造价系统时遇到一些需要汇总的指标数据 类似下面的结构 指标A 1000 指标B 500 指标C 500 指标A = B+C 当我们需要对这些数值进行校验时,实现的方法有很多种,数据库里写存储过程去更新每行数据, 或者我们在程序中遍历等等,但用起来都挺烦琐的. 这时候想到了 Linq To Object 这个技术 简单说下 Linq 它是.Net Framework 3.5 引入的新技术 它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据. 主要 有几点好处 简

  • c# 动态构建LINQ查询表达式

    作者:精致码农 出处:http://cnblogs.com/willick 联系:liam.wang@live.com 最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果只有一两个这样的数字列,那么使用 Entity Framework Core 可以这么写 LINQ 查询: public Task<List<Product>> Ge

  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换

    一.DataTable的扩展方法: 1.DataTable转Linq:AsEnumerable 方法 返回的EnumerableRowCollection<DataRow> 实现了 IEnumerable<T>接口.其中泛型参数T是DataRow. 此对象可用在 LINQ表达式或方法查询中. 语法: public static EnumerableRowCollection<DataRow> AsEnumerable (this DataTable source); 在

  • C#中的Linq to JSON操作详解

    目录 一.创建JObject and JArrary实例 1.手动创建JSON 1.创建JSON对象,JObject 2.创建JSON数组,JArrary 2.使用Linq创建JSON 3.从对象创建JSON 4.解析JSON文本 5.从文件中加载JSON 二.使用JsonConvert.DeserializeObject反序列化JOSN片段 1.数组数据 2.对象格式 三.修改JObject and JArrary实例 四.查询JObject and JArrary实例 判断Key是否存在 五

  • C#中增加SQLite事务操作支持与使用方法

    本文实例讲述了C#中增加SQLite事务操作支持与使用方法.分享给大家供大家参考,具体如下: 在C#中使用Sqlite增加对transaction支持 using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.Globalization; using System.Linq; using System.Windows.Forms; namesp

  • SQLite在C#中的安装与操作技巧

    SQLite 介绍 SQLite,是一款轻型的数据库,用于本地的数据储存. 先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了:作为轻量级数据库,他的处理速度也足够快:支持的的容量级别为T级:独立: 没有额外依赖:开源:支持多种语言: 我的用途 在项目开发中,需要做一次数据数据同步.因为数据库实时数据的同步,需要记录更新时间,系统日志等等数据:当然,你也可以选择写ini和xml等等配置文件来解决,但是都如数据库可读性高不是. 安装 1. 引用 .NET 驱动 http://sy

  • hadoop map-reduce中的文件并发操作

    这样的操作在map端或者reduce端均可.下面以一个实际业务场景中的例子来简要说明. 问题简要描述: 假如reduce输入的key是Text(String),value是BytesWritable(byte[]),不同key的种类为100万个,value的大小平均为30k左右,每个key大概对应 100个value,要求对每一个key建立两个文件,一个用来不断添加value中的二进制数据,一个用来记录各个value在文件中的位置索引.(大量的小文件会影响HDFS的性能,所以最好对这些小文件进行

  • 解决IE7中使用jQuery动态操作name问题

    问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就不能调试,就不能知道改了后还会不会有这样的问题. 想想可能与客户环境唯一不同就只有可能是js缓存问题了,然后把所有的js文件引用的地方都加上一个当前时间参数,然问题依然存在. 本来规定的版本就是IE8,所以也没有想过会有版本兼容问题,在说了咱用的是jquery,jqeruy的出现不就是号称为了解决浏

  • JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象 Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维数组的功能 1.1 定义数组 声明有10个元素的数组 复制代码 代码如下: var a = new Array(10); 此时为a已经开辟了内存空间,包含10个元素,用数组名称加 [下标] 来调用,例如

  • Java中精确的浮点运算操作示例

    本文实例讲述了Java中精确的浮点运算操作.分享给大家供大家参考,具体如下: Java中浮点运算对于很多值浮点数都是采用其能够表示的离目标值最近的数来表示,这有可能会在计算中带来不易觉察的误差. 如下所例: public class ssss { public static void main(String[] ages){ double d1=2.07; double d2=1.03; System.out.println(d1+d2); } } 结果: 虽然计算结果离精确值误差很小,但其不是

  • iOS开发中使用SQL语句操作数据库的基本用法指南

    SQL代码应用示例 一.使用代码的方式批量添加(导入)数据到数据库中 1.执行SQL语句在数据库中添加一条信息 插入一条数据的sql语句: 点击run执行语句之后,刷新数据 2.在ios项目中使用代码批量添加多行数据示例 代码示例: 复制代码 代码如下: // //  main.m //  01-为数据库添加多行数据 // //  Created by apple on 14-7-26. //  Copyright (c) 2014年 wendingding. All rights reserv

  • js中confirm实现执行操作前弹出确认框的方法

    本文实例讲述了js中confirm实现执行操作前弹出确认框的方法.分享给大家供大家参考.具体实现方法如下: 现在在删除或其它操作前弹出确定提示,我们有很多方法,最基本的就是利用js自带的函数confirm来操作了 最简单的用法如下: 鼠标事件使用confirm 复制代码 代码如下: <a href="#" onclick= "if(confirm( '是否确定! ')==false)return   false; ">点击确定</a> 想简单

随机推荐