转载http://www.cnblogs.com/Dlonghow/p/1413830.html

Linq (Language Integrated Query,语言集成查询),是微软公司提供的一项新技术,它能够将查询功能引入到.NET 3.5 所支持的编程语言中,例如C#,Visual Basic.NET。查询操作通过编程语言自身来表达,而不再是以字符串的形式嵌入到应用程序中。

Linq主要包含下面四个组件:

Linq to Objets、Linq to Sql、Linq to DataSet和Linq to XML,它们分别用于查询和处理对象数据(如集合等)、关系数据、DataSet对象数据和XML结构的数据(如XML文件)。

1.什么是Linq

“查询”是一组指令,使用这些指令可以从一个或是对个给定的数据源中检索数据,并返回指定表现形式的结果。Linq也是一种查询,它集成于.NET3.5之中,可以为C#等编程语言提供强大的方便的查询功能,并与其整合一体,成为Visual Studio 2008中的一组全新的功能。

linq也是一種查詢技術,

from:字句描述被查询的数据源

where: 字句指定元素满足的过滤条件

  1. List<int> myDataSource = new List<int> { 1, 2, 23, 4, 15, 26, 15, 5, 45, 61, 8, 9 };
  2.  
  3. var result = from i in myDataSource
  4.  
  5. where i < 10
  6.  
  7. select i;

反思:传统编程中,查询数据往往需要将字符串嵌入到应用程序中进行查询操作,这样一般不会检查被查询的数据类型。Linq使得查询操作成为编程语言的一部分,可以象书写代码一样,方便的创建查询和表达式。

2. Linq基本组成组件

Linq是一项突破性创新技术,将数据、对象和日常编程语言之间架起一座桥梁。几乎可以查询和操作任何存储形式的数据。

(1)       Linq to Sql组件:可以查询关系型数据库的数据,并可以提供其他操作,如检索、插入、修改、删除、排序、聚合、分区等。

(2)       Linq to DataSet组件:查询DataSet对象中的数据。

(3)       Linq to Object组件:可以查询IEnumerable或是IEnumerable<T> 集合对象,即能够查询任何可以枚举的集合,如数组(Array和ArrayList)、泛型字典Dictinary<T>等,以及用户自定义的集合,而不需要使用Linq提供程序或API。

(4)       Linq to XML组件:查询和操作XML结构的数据。

3. 开发环境

关于开发环境,简单补充如下:

要开发ASP.NET 3.0/3.5Web 应用程序,则需要安装Microsoft Visual Studio 2008集成开发环境(IDE)。因为Linq被.NET 3.5所支持,故若是创建Linq的Web应用程序或是Windows Form应用程,必须使用.NET 3.5.

4. 第一个使用Linq的web应用程序

(1)创建一个WebSite,命名 Linq_Sample_1;

(2)创建一个整形数组intDataSource,长度100,for初始化该数组(0~99);

(3)创建Linq查询表达式,从数组中查询小于20的元素。并保存的query变量中。

  1. protected void Page_Load(object sender, EventArgs e)
  2.  
  3. {
  4.  
  5. if (!this.IsPostBack)
  6.  
  7. {
  8.  
  9. LinqQueryData();
  10.  
  11. }
  12.  
  13. }
  14.  
  15. public void LinqQueryData()
  16.  
  17. {
  18.  
  19. int[] intDataSource = new int[100];
  20.  
  21. for (int i = 0; i < 100; i++)
  22.  
  23. {
  24.  
  25. intDataSource[i] = i;
  26.  
  27. }
  28.  
  29. // 创建Linq查询语句
  30.  
  31. var query = from i in intDataSource
  32.  
  33. where i < 20
  34.  
  35. select i;
  36.  
  37. foreach (var q in query)
  38.  
  39. {
  40.  
  41. Response.Write(q.ToString() + "<br/>");
  42.  
  43. }
  44.  
  45. }

5. 四个重要接口

进一步学习Linq需要熟悉Linq最基本的四个接口。即:IEnumerable、IEnumerable<T>、IQueryable和IQueryable<T>,所有支持linq查询的对象,都必须直接或是间接是想IEnumerable接口。

关于四个类的详细设计,你可以参阅MSDN。

6. 与Linq相关的命名空间

.NET 3.5 提供了多个与Linq相关的命名空间,如:

(1)       System.Linq 命名空间,提供支持使用Linq进行查询的类和接口,如Enumerable类、Queryable类、IQueryable 接口、IQueryable<T>接口、IorderedQueryable接口、IorderQueryable<T>接口等。

(2)       System.Data.Linq 命名空间,提供与Linq to Sql相关的类、结构、接口和枚举,如Table<T>类,EntityRef<T>结构、EntitySet<T>结构、IExecuteResult接口、IFunctionResult接口、IMultipleResults接口、ISingleResult<T>接口等。

(3)       System.Xml.Linq命名空间,提供与Linq to XML相关的类和枚举,如XDocument类、XElement类、XAttribute类、XDeclaration类、XName类、XNamespace类、XText类等。

7. Linq 查询的优势

这里提前强调是,为便于讲解或是体验,定义数据库MyLinqDB为本学习笔记贯穿始终的数据库名称。

1)、查询集合中的数据

传统方法为使用for或是foreach语句,而Linq使用查询表达式查询集合中的数据。书写简洁、容易添加判断条件。

7.1.1 Foreach 查询集合

  1. private void OldArrayQuery()
  2. {
  3. string[] datasource = new string[10];
  4.  
  5. for (int i = 0; i < 10; i++)
  6. {
  7. datasource[i] = "LINQ" + i.ToString().PadLeft(5, '0');
  8. }
  9.  
  10. // 创建一动态数组,保存查询结果
  11. ArrayList result = new ArrayList();
  12. foreach (string s in datasource)
  13. {
  14. int index = Int32.Parse(s.Substring(4));
  15.  
  16. if (index % 2 == 0)
  17. {
  18. result.Add(s);
  19. }
  20. }
  21.  
  22. foreach (string s in result)
  23. {
  24. Response.Write(s + "<br/>");
  25. }
  26. }

7.1.2 Linq查询数组

  1. private void LinqArrayQuery()
  2.  
  3. {
  4.  
  5. string[] datasource = new string[10];
  6.  
  7. for (int i = 0; i < 10; i++)
  8.  
  9. {
  10.  
  11. datasource[i] = "LINQ" + i.ToString().PadLeft(5, '0');
  12.  
  13. }
  14.  
  15. var result = from s in datasource
  16.  
  17. let index = int.Parse(s.Substring(4))
  18.  
  19. where index % 2 == 0
  20.  
  21. select s;
  22.  
  23. foreach (string s in result)
  24.  
  25. {
  26.  
  27. Response.Write(s + "<br/>");
  28.  
  29. }
  30.  
  31. }

反思:

Foreach语句往往与查询条件相互分隔,代码相对繁琐;Linq,一个查询表达式即可实现查询和配置查询两个功能。代码相对较少,集成度也较高。

7.2.1查询数据库中的数据

传统的方法为使用SQL语句或是存储过程直接进行查询;而是用Linq查询数据库中的数据,需要为该数据库创建实体类,然后使用Linq查询表达式查询相关数据。

传统的方法无非创建数据库连接对象(Connection),查询语句”Select * from Mytable”,或有参数或无参数,接着再创建一个SQL语句的命令对象Command,调用ExecuteReader()方法读取数据,并保存在变量中供使用。

具体实现代码这里不做赘述。

Linq查询数据库中的数据的过程:

(1)       为MyLinqDB数据库创建DBML文件LinqDB.dbml,并为表创建实体类 。

(2)       创建LinqDB数据库的数据上下文类的实例,连接字符串保存在strConn。

(3)       创建查询表达式,将查询结果存在results变量中。

(4)       使用foreach语句显示results变量中的查询结果。

代码比较如下:

(1) 传统方法:

  1. private void OldSQLQuery()
  2. {
  3. // 创建数据库连接
  4. SqlConnection con = new SqlConnection(strCon);
  5.  
  6. // 创建SQL语句、
  7. string cmdText = "select * from Products";
  8. //创建SqlCommand 对象 执行SQL 命令
  9. SqlCommand cmd = new SqlCommand(cmdText, con);
  10. con.Open();
  11. // 执行查询操作
  12. SqlDataReader reader = cmd.ExecuteReader();
  13. while (reader.Read())
  14. {
  15. if (reader["ProductName"].ToString().Length > 6)
  16. {
  17. Response.Write(reader["ProductName"].ToString() + "</br>");
  18. }
  19. }
  20.  
  21. reader.Close();
  22. con.Close();
  23. }

(2) Linq to SQL :

  1. private void LinqSQLQuery()
  2.  
  3. {
  4.  
  5. LinqDBMLDataContext db = new LinqDBMLDataContext(strCon);
  6.  
  7. var results = from p in db.Products
  8.  
  9. where p.ProductName.Length > 10
  10.  
  11. select p;
  12.  
  13. foreach (var i in results)
  14.  
  15. {
  16.  
  17. Response.Write(i.ProductName + "</br>");
  18.  
  19. }
  20.  
  21. }

代码简洁明朗。

3)、查询DataSet对象中的数据

传统方法往往需要使用foreach语句等,遍历读取。Linq则使用查询表达式查询对象中的数据。

代码比较如下:

(1) 传统方法:

  1. 复制代码
  2. private DataSet GetDataSet()
  3. {
  4. SqlConnection con = new SqlConnection(strCon);
  5. string cmdText = "select * from products";
  6.  
  7. SqlDataAdapter da = new SqlDataAdapter(cmdText, con);
  8. con.Open();
  9.  
  10. DataSet ds = new DataSet();
  11. da.Fill(ds, "Product");
  12. con.Close();
  13.  
  14. return ds;
  15. }
  16.  
  17. private void OldDataSetQuery()
  18. {
  19. DataSet ds = GetDataSet();
  20.  
  21. foreach (DataRow row in ds.Tables[0].Rows)
  22. {
  23. if (row["ProductName"].ToString().Length > 10)
  24. {
  25. Response.Write(row["ProductName"].ToString() + "<br/>");
  26. }
  27. }
  28. }

(2)      Linq to DataSet

  1. private void LinqDataSetQuery()
  2.  
  3. {
  4.  
  5. DataSet ds = GetDataSet();
  6.  
  7. var results = from p in ds.Tables[0].AsEnumerable()
  8.  
  9. where p.Field<string>("ProductName").Length > 10
  10.  
  11. select p;
  12.  
  13. foreach (var v in results)
  14.  
  15. {
  16.  
  17. Response.Write(v.Field<string>("ProductName").ToString() + "<br/>");
  18.  
  19. }
  20.  
  21. }

4)、查询XML文件

传统的方法往往使用XPath。Linq使用查询表达式查询XML文件中的数据。

代码比较如下:

(1)      传统方法

  1. private string xmlString =
  2. "<Books>"
  3. + "<Book ID=\"101\">"
  4. + "<No>0001</No>"
  5. + "<Name>Book 0001</Name>"
  6. + "<Price>120</Price>"
  7. + "<Remark>This is a book 0001.</Remark>"
  8. + "</Book>"
  9. + "<Book ID=\"102\">"
  10. + "<No>0002</No>"
  11. + "<Name>Book 0002</Name>"
  12. + "<Price>120</Price>"
  13. + "<Remark>This is a book 0002.</Remark>"
  14. + "</Book>"
  15. + "<Book ID=\"103\">"
  16. + "<No>0003</No>"
  17. + "<Name>Book 0003</Name>"
  18. + "<Price>120</Price>"
  19. + "<Remark>This is a book 0003.</Remark>"
  20. + "</Book>"
  21. + "</Books>";
  22.  
  23. private void OldXMLQuery()
  24. {
  25. XmlDocument doc = new XmlDocument();
  26. doc.LoadXml(xmlString);
  27.  
  28. string path = "/Books/Book";
  29. XmlNodeList nodeList = doc.SelectNodes(path);
  30.  
  31. foreach (XmlNode node in nodeList)
  32. {
  33. foreach (XmlNode n in node.ChildNodes)
  34. {
  35. if (n.InnerXml == "Book 0002")
  36. {
  37. Response.Write(node.LocalName + node.Attributes["ID"].Value + "<br/>");
  38. }
  39. }
  40. }
  41. }

(2)      Linq to XML

  1. private void LinqXMLQuery()
  2. {
  3. XElement xe = XElement.Parse(xmlString);
  4. var results = from x in xe.Elements()
  5. where (string)x.Element("Name") == "Book 0002"
  6. select x;
  7.  
  8. foreach (var e in results)
  9. {
  10. Response.Write(e.Name.LocalName + e.Attribute("ID").Value + "<br/>");
  11. }
  12. }

LINQ技术的更多相关文章

  1. 《LINQ技术详解C#》-4.LINQ到对象

    public static string[] Presidents { get; } = { "Adams", "Arthur", "Buchanan ...

  2. Linq学习总结1--参考Linq技术详解

    2个要点: 1.linq操作的集合必须实现IEnumerable接口,所以在这3.0之前为实现该接口的集合需通过Cast或TypeOf方法转换成可Linq的集合; 2.查询式和Lame那啥表达式都可以 ...

  3. Linq技术四:动态Linq技术 -- Linq.Expressions

    前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; ...

  4. C#Linq技术中SelectMany(...)的内部实现推测

    对于声明为:public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable&l ...

  5. C#Linq技术中SelectMany(...)函数的内部实现的伪代码

    我们先来假设这种场景: 一个学校中有多个年级,一个年级有多个班级,一个班级里有多个学生.这里我们只需要班级.年级.和学生这三个概念: 让我们先来定义Class类和Student类: // 注意,Cla ...

  6. 《LINQ技术详解C#》-5.非延迟操作符

    1.转换操作符 1.ToArray 从一个类型为T的输入序列创建一个类型为T的数组. 2.ToList 从一个类型为T的序列创建一个类型为T的列表. 3.ToDictionary 从类型为T的序列创建 ...

  7. 《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符

    (1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量. 透明标识符只在翻译过程中存在,翻译结束将不再出现. (2)翻译步骤 ①带有into连续语句的Select和Group语句 from. ...

  8. 【转】Entity Framework技术系列之7:LINQ to Entities

    前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据. L ...

  9. LINQ数据库技术

    LINQ(Language Integrated Qyery),中文名字是语言集成查询.它提供一个统一的编程概念和语法,编程人员不需要关心将要访问的是关系数据库还是XML数据,或是远程的对象,它都采用 ...

随机推荐

  1. Android gradle provided、implementation等指令注意点

    其实这类文章博客网上一搜一大堆,但有些地方可能说的不太清楚(都一样的内容,抄袭太严重),这里只是做个精简的总结和一些其他地方没提到的点. 一.Android Studio 3.0开始使用了新的指令,原 ...

  2. ( linker command failed with exit code 1) 错误解决方案 项目使用的是pod

    targets -> build settings -> architectures -> build active architecture only -> debug 改成 ...

  3. jquery 中多选和全选

  4. GoogLeNet 之 Inception v1 v2 v3 v4

    论文地址 Inception V1 :Going Deeper with Convolutions Inception-v2 :Batch Normalization: Accelerating De ...

  5. Client-Side Attacks

    1.之前看到中间人攻击方式,要使用ssl服务构架一个劫持会话,使得攻击者和被攻击者客户端连接.ssl 服务(secure Socket Layer安全套接) ,以及后续出现的TSL(Transport ...

  6. Nginx详解一:Nginx基础篇之环境准备

    环境确认: 1.确认系统网络可用 2.确认yum源可用 3.确认关闭iptabkes规则 查看是否有iptabkes规则:iptables -L 如果有的话:iptables -F关闭 保险起见也看看 ...

  7. 什么是 TCP 拆、粘包?如何解决(Netty)

    前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个 ...

  8. 异常小结:上一张图搞清楚Java的异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  9. python进行进制转换

    # 10进制转为2进制 print(bin(10)) # 结果:0b1010 # 2进制转为10进制 print(int("1001", 2)) # 结果:9 # 10进制转为16 ...

  10. IEDA序列化设置