C#参考:Linq 概述

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> { 1, 2, 23, 4, 15, 26, 15, 5, 45, 61, 8, 9 };

var result = from i in myDataSource

where i < 10

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[100];
        for (int i = 0; i < 100; i++)
        {
            intDataSource[i] = i;
        }

// 创建Linq查询语句
        var query = from i in intDataSource
                    where i < 20
                    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[10];

for (int i = 0; i < 10; i++)
        {
            datasource[i] = "LINQ" + i.ToString().PadLeft(5, ‘0‘);
        }

// 创建一动态数组,保存查询结果
        ArrayList result = new ArrayList();
        foreach (string s in datasource)
        {
            int index = Int32.Parse(s.Substring(4));

if (index % 2 == 0)
            {
                result.Add(s);
            }
        }

foreach (string s in result)
        {
            Response.Write(s + "<br/>");
        }
    }

7.1.2 Linq查询数组

private void LinqArrayQuery()
    {
        string[] datasource = new string[10];

for (int i = 0; i < 10; i++)
        {
            datasource[i] = "LINQ" + i.ToString().PadLeft(5, ‘0‘);
        }

var result = from s in datasource
                     let index = int.Parse(s.Substring(4))
                     where index % 2 == 0
                     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 > 6)
        {
            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 > 10
                      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[0].Rows)
        {
            if (row["ProductName"].ToString().Length > 10)
            {
                Response.Write(row["ProductName"].ToString() + "<br/>");
            }
        }
    }

(2)      Linq to DataSet

private void LinqDataSetQuery()
    {
        DataSet ds = GetDataSet();

var results = from p in ds.Tables[0].AsEnumerable()
                      where p.Field<string>("ProductName").Length > 10
                      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=\"101\">"
                + "<No>0001</No>"
                + "<Name>Book 0001</Name>"
                + "<Price>120</Price>"
                + "<Remark>This is a book 0001.</Remark>"
            + "</Book>"
            + "<Book ID=\"102\">"
                + "<No>0002</No>"
                + "<Name>Book 0002</Name>"
                + "<Price>120</Price>"
                + "<Remark>This is a book 0002.</Remark>"
            + "</Book>"
            + "<Book ID=\"103\">"
                + "<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/>");
        }
    }

时间: 2024-10-05 04:43:18

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

从LINQ开始之LINQ to Objects(上)

LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LINQ总共包括五个部分:LINQ to Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML.LINQ to Objects:对内存中集合的操作LINQ to DataSets:对数据集Datatable的操作LINQ to

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

软件开发要干什么: 反映真实世界要自动化的业务流程 解决现实问题 领域Domain Domain特指软件关注的领域 在不能充分了解业务领域的情况下是不可能做出一个好的软件 领域建模 领域模型驱动设计 }  分层架构 }  实体 }  值对象 }  服务 }  模块 }  聚合 }  工厂 }  资源库 分层架构: }  将领域模型相关的代码集中到一个层中,把它从用户界面.应用和基础设施代码中分隔开来 }  释放领域对象的显示自己.保存自己.管理应用任务等职责,让它专注于展现领域模型 }  复杂的

LINQ 流程简介

1.简介 query (查询)是一种从数据源检索数据的表达式.查询一般用专门的查询语言来实现.对各种数据源,都已经有对应的的查询语言,例如,用于关系数据库的SQL语言,用于XML的XQuery语言.因此,开发人员不得不对他们必须支持的每种数据源或数据格式学习新的查询语言.LINQ为了简化这一情况,提供了一种跨各种数据源和数据格式的的模型.在LINQ查询中,面对的始终是对象.你可以使用相同的编码模式来查询和转换XML文档.SQL数据库.ADO.NET数据集..NET集合以及其他LINQ提供的文件格

LINQ之路 4:LINQ方法语法

书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression). LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方式来创建复杂的查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# 3.0对于LINQ表达式还引入了声明式的查询语法,通过查询语法写出的查询比较类似于SQL查询.本篇会对LINQ方法语法进行详细的介绍. 当然,.NET公共语言运行库(CLR)并不具有查询语法的概念.所以,编译器会在

正则表达式学习参考

正则表达式学习参考 1       概述 正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中“高大”.“坚固”等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种

Canvas API

概述 绘图方法 图像处理方法 drawImage方法 getImageData方法,putImageData方法 toDataURL方法 save方法,restore方法 像素处理 灰度效果 复古效果 红色蒙版效果 亮度效果 反转效果 参考链接 概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap). 使用前,首先需要新建一个canvas网页元素. <canvas id="myCanvas"

PhantomJS

PhantomJS 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 概述 REPL环境 webpage模块 open() evaluate() includeJs() render() viewportSize,zoomFactor onResourceRequested onResourceReceived system模块 应用 过滤资源 截图 抓取图片 生成网页 参考链接 概述 有时,我们需要浏览器处理网页,但并不需要浏览,比如生成网页的截图.抓取网页数据等

Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

C#中常用的几种读取XML文件的方法

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问