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 也是一种查询技术。下面我们使用Linq从以整数集合中查询数值小于10的元素。其中,

From:子句描述被查询的数据源;

Where:子句指定元素所满足的过滤条件;

Select:子句制定查询结果的表现形式。

List<int> myDataSource = new List<int> { , , , , , , , , , , ,  };

var result = from i in myDataSource

             where i < 

             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变量中。

 protected void Page_Load(object sender, EventArgs e)

    {

        if (!this.IsPostBack)

        {

            LinqQueryData();

        }

    }

    public void LinqQueryData()

    {

        int[] intDataSource = new int[];

        for (int i = ; i < ; i++)

        {

            intDataSource[i] = i;

        }

        // 创建Linq查询语句

        var query = from i in intDataSource

                    where i < 

                    select i;

        foreach (var q in query)

        {

            Response.Write(q.ToString() + "<br/>");

        }

    }

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 查询集合

    private void OldArrayQuery()

    {

        string[] datasource = new string[];

        for (int i = ; i < ; i++)

        {

            datasource[i] = "LINQ" + i.ToString().PadLeft(, '');

        }

        // 创建一动态数组,保存查询结果

        ArrayList result = new ArrayList();

        foreach (string s in datasource)

        {

            int index = Int32.Parse(s.Substring());

            if (index %  == )

            {

                result.Add(s);

            }

        }

        foreach (string s in result)

        {

            Response.Write(s + "<br/>");

        }

    }

7.1.2 Linq查询数组

 private void LinqArrayQuery()

    {

        string[] datasource = new string[];

        for (int i = ; i < ; i++)

        {

            datasource[i] = "LINQ" + i.ToString().PadLeft(, '');

        }

        var result = from s in datasource

                     let index = int.Parse(s.Substring())

                     where index %  == 

                     select s;

        foreach (string s in result)

        {

            Response.Write(s + "<br/>");

        }

    }

反思:

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) 传统方法:

private void OldSQLQuery()

{

    // 创建数据库连接

    SqlConnection con = new SqlConnection(strCon);

    // 创建SQL语句、

    string cmdText = "select * from Products";

    //创建SqlCommand 对象 执行SQL 命令

    SqlCommand cmd = new SqlCommand(cmdText, con);

    con.Open();

    // 执行查询操作

    SqlDataReader reader = cmd.ExecuteReader();

    while (reader.Read())

    {

        if (reader["ProductName"].ToString().Length > )

        {

            Response.Write(reader["ProductName"].ToString() + "</br>");

        }

    }

    reader.Close();

    con.Close();

}

(2) Linq to SQL :

 private void LinqSQLQuery()

    {

        LinqDBMLDataContext db = new LinqDBMLDataContext(strCon);

        var results = from p in db.Products

                      where p.ProductName.Length > 

                      select p;

        foreach (var i in results)

        {

            Response.Write(i.ProductName + "</br>");

        }

    }

代码简洁明朗。

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

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

代码比较如下:

(1) 传统方法:

   private DataSet GetDataSet()

    {

        SqlConnection con = new SqlConnection(strCon);

        string cmdText = "select * from products";

        SqlDataAdapter da = new SqlDataAdapter(cmdText, con);

        con.Open();

        DataSet ds = new DataSet();

        da.Fill(ds, "Product");

        con.Close();

        return ds;

    }

    private void OldDataSetQuery()

    {

        DataSet ds = GetDataSet();

        foreach (DataRow row in ds.Tables[].Rows)

        {

            if (row["ProductName"].ToString().Length > )

            {

                Response.Write(row["ProductName"].ToString() + "<br/>");

            }

        }

    }

(2)      Linq to DataSet

    private void LinqDataSetQuery()

    {

        DataSet ds = GetDataSet();

        var results = from p in ds.Tables[].AsEnumerable()

                      where p.Field<string>("ProductName").Length > 

                      select p;

        foreach (var v in results)

        {

            Response.Write(v.Field<string>("ProductName").ToString() + "<br/>");

        }

    }

4)、查询XML文件

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

代码比较如下:

(1)      传统方法

 private string xmlString =

        "<Books>"

            + "<Book ID=\"\">"

                + "<No>0001</No>"

                + "<Name>Book 0001</Name>"

                + "<Price>120</Price>"

                + "<Remark>This is a book 0001.</Remark>"

            + "</Book>"

            + "<Book ID=\"\">"

                + "<No>0002</No>"

                + "<Name>Book 0002</Name>"

                + "<Price>120</Price>"

                + "<Remark>This is a book 0002.</Remark>"

            + "</Book>"

            + "<Book ID=\"\">"

                + "<No>0003</No>"

                + "<Name>Book 0003</Name>"

                + "<Price>120</Price>"

                + "<Remark>This is a book 0003.</Remark>"

            + "</Book>"

        + "</Books>";

    private void OldXMLQuery()

    {

        XmlDocument doc = new XmlDocument();

        doc.LoadXml(xmlString);

        string path = "/Books/Book";

        XmlNodeList nodeList = doc.SelectNodes(path);

        foreach (XmlNode node in nodeList)

        {

            foreach (XmlNode n in node.ChildNodes)

            {

                if (n.InnerXml == "Book 0002")

                {

                    Response.Write(node.LocalName + node.Attributes["ID"].Value + "<br/>");

                }

            }

        }

    }

(2)      Linq to XML


    private void LinqXMLQuery() 

    {

        XElement xe = XElement.Parse(xmlString);

        var results = from x in xe.Elements()

                      where (string)x.Element("Name") == "Book 0002"

                      select x;

        foreach (var e in results)

        {

            Response.Write(e.Name.LocalName + e.Attribute("ID").Value + "<br/>");

        }

    }

C#参考:Linq 概述的更多相关文章

  1. .NET LINQ概述

    LINQ      语言集成查询 (LINQ) 是 Visual Studio 2008 中引入的一组功能,它在对象领域和数据领域之间架起了一座桥梁.可为 C# 和 Visual Basic 语言语法 ...

  2. Linq学习(主要参考linq之路)----2LINQ方法语法

    方法语法:Fluent Syntax 方法语法是非常灵活和重要的.我们这里讲描述使用连接查询运算符的方式来创建复杂的子查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询. eg1: st ...

  3. LINQ笔记

    LINQ概述 语言集成查询(Language intergrated Query,LINQ)在C#编程语言中集成了查询语法. 可以使用相同的语法访问不同的数据源 提供了不同数据源的抽象层,所有可以使用 ...

  4. 【读书笔记】C#高级编程 第十一章 LINQ

    (一)LINQ概述 语言集成查询(Language Integrated Query,LINQ)在C#编程语言中继承了查询语法,可以用相同的语法访问不同的数据源. 1.LINQ查询 var query ...

  5. 领域模型驱动设计(Domain Driven Design)入门概述

    软件开发要干什么: 反映真实世界要自动化的业务流程 解决现实问题 领域Domain Domain特指软件关注的领域 在不能充分了解业务领域的情况下是不可能做出一个好的软件 领域建模 领域模型驱动设计 ...

  6. LINQ之路 4:LINQ方法语法

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression). LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方 ...

  7. LINQ之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. 1.LINQ体系结构 从上图可以看出,L ...

  8. 从LINQ开始之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...

  9. LINQ之路16:LINQ Operators之集合运算符、Zip操作符、转换方法、生成器方法

    本篇将是关于LINQ Operators的最后一篇,包括:集合运算符(Set Operators).Zip操作符.转换方法(Conversion Methods).生成器方法(Generation M ...

随机推荐

  1. [Java Web] 6、Tomcat服务器的安装及配置以及JSP技术笔记

    目录  1.Web容器简介  2.Tomcat粗介及配置粗讲  3.Tomcat服务器配置 3-1.修改端口号  3-2.配置虚拟目录 3-3.配置首页  4.JSP执行流程  5.JSP粗略了解 1 ...

  2. 如何给input[file]定义cursor

    来源:http://stackoverflow.com/questions/1537223/change-cursor-type-on-input-type-file Simple question. ...

  3. paip. 解决java程序不能自动退出

    paip. 解决java程序不能自动退出 原因:有东西在运行,所以,不能自动退出.. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址: ...

  4. ServiceStack Web Service 创建与调用简单示列

    目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 上篇文章介绍了ServiceStack是什么,本章进入主题,如何快速简单的搭建Service ...

  5. html-css样式表

    一.CSS:Cascading Style Sheet—层叠样式表,其作用是美化HTML网页. 样式表分类:内联样式表.内嵌样式表.外部样式表 1.内联样式表 和HTML联合显示,控制精确,但是可重用 ...

  6. javaweb学习总结(四)——Http协议

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  7. php读取大文件的方法

    1.使用file 函数直接读取 $starttime = microtime_float(); ini_set('memory_limit','-1'); $file = "testfile ...

  8. PHOTOSHOP CC 2015插件安装方法

    收到很多评论说不能安装.抱歉,这里解释一下,不是所有插件都能用这个方法,安装不了的只能等插件更新了,这里只是给大家一个尝试的方法,有一些插件可以用这个方法安装. 试试嘛,如果懒得试,可以忽略这篇文章. ...

  9. 奇怪吸引子---ShimizuMorioka

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  10. 为什么你还在用嵌入式的方式来使用mod_wsgi?

    可能你还不知道你的python 网站是否跑在embedded mod of  mod_wsgi,不管你知不知道请看下去,因为大部分人都是在这个工作模式下运行的.嵌入式顾名思义就是运行在apache的子 ...