C#编程(六十八)

时间:2022-06-03 03:59:45

LINQ也就是Language Interrated Query的缩写,怎么一个缩写法我也不明白,即语言集成查询,是微软在.NET3.5中提出的一项新技术,LINQ主要包含四个组件,下面看一下LINQ的一个架构图:

C#编程(六十八)

简单的介绍一些四个组件:

1.Linq to SQL 组件----可以查询基于关于数据的数据(微软本身只是实现了对SQL Server的查询,可以对数据库中的数据进行查询,修改,插入删除,排序等操作)

2.LINQ to Dataset组件----可以查询Dataset对象中的数据,并对数据进行增删改查的操作

3.LINQ to Objects组件----可以查询IEnumerable或IEnumerable<T>集合

4.LINQ to XML 组件----可以查询和操作XML文件,比Xpath操作和XML更加方便

二.使用LINQ的好处是啥

上面说到LINQ的四个组件,分笔试对不同数据进行增删改查的一些操作,然而以前也是有相关技术对这些数据进行操作,(例如,对数据库的操作,之前有ADO.NET对其进行支持,对XML的操作,之前也可以Xpath来操作XML文件等),此时应该大家会有个疑问,为什么以前都有相关技术对其支持,我们还要学习LINQ呢,对于这个疑问答案很简单,Linq 使操作这些数据源更加简单,方便和易于理解,之前的技术操作起来过于繁琐,所以微软也有上进心啊,希望可以做的更好啊,所以就在C# 3中提出了Linq来方便大家操作这些数据源,,下面通过对比来说明Linq是如何简单方便:

2.1查询集合中的数据

之前我们查询集合中的数据一般会使用for或者foreach语句来进行查询,而LINQ实用查询表达式来进行查询,LINQ表达式比之前用for或foreach的方式更加简洁,比较容易添加筛选条件,下面就具体看看两者方式的比较代码(假设一个场景----返回集合中序号为偶数的元素)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace LINQ小结

{

class Program

{

static void Main(string[] args)

{

OldQuery();

LinqQuery();

Console.ReadKey();

}

//使用foreach返回集合中序号为偶数的元素

public static void OldQuery()

{

Console.WriteLine("使用老方法来对集合对象查询,查询结果为:");

//初始化查询的集合

List<string> collection = new List<string>();

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

{

collection.Add("A"+i.ToString());

}

//创建保存查询结果的集合

List<string> queryResults = new List<string>();

foreach (var item in collection)

{

//获取元素序号

int index = int.Parse(item.Substring(1));

//查询序号为偶数的元素

if (index%2==0)

{

queryResults.Add(item);

}

}

foreach (var item in queryResults)

{

Console.WriteLine(item);

}

}

//使用LINQ返回集合中序号为偶数的元素

public static void LinqQuery()

{

Console.WriteLine("使用Linq方法来对集合对象查询,查询结果为:");

//初始化查询的数据

List<string> collection = new List<string>();

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

{

collection.Add("A" + i.ToString());

}

//创建查询表达式来获得序号为偶数的元素

var queryResults = from s in collection

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

where index % 2 == 0

select s;

// 输出查询结果

foreach (string s in queryResults)

{

Console.WriteLine(s);

}

}

}

}

从上面的连个方法比较中可以看出使用LINQ对集合查询时确实简单了很多,并且也容易添加筛选条件(只需要在where后面添加额外的筛选条件即可),运行结果当然也是我们期望的.

2.2查询XML文件

之前我们大部分都会使用XPath来对XML文件进行查询,然而使用XPath来查询XML文件需要首先知道XML文件的具体结构,而LINQ查询表达式在查询XML数据是,可以不需要知道XML文件结构,并且编码更加简单,容易添加判断的条件,下面就具体代码来说明适用LINQ查询的好处(这里假设一个场景----有一个定义Persons的XML文件,现在我们要求查找出XML文件中Name节点为”李四”的元素):

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Xml;

using System.Xml.Linq;

namespace LINQ小结

{

class Program

{

static void Main(string[] args)

{

OldLinqToXMLQuery();

UsingLinqToXMLQuery();

Console.ReadKey();

}

// 初始化XML数据

private static string xmlString =

"<Persons>" +

"<Person Id=‘1‘>" +

"<Name>张三</Name>" +

"<Age>18</Age>" +

"</Person>" +

"<Person Id=‘2‘>" +

"<Name>李四</Name>" +

"<Age>19</Age>" +

"</Person>" +

"<Person Id=‘3‘>" +

"<Name>王五</Name>" +

"<Age>22</Age>" +

"</Person>" +

"</Persons>";

//使用Xpath方式来对XML文件进行查询

private static void OldLinqToXMLQuery()

{

Console.WriteLine("使用Xpath方式来对XML文件进行查询");

//导入XML文件,这里需要使用命名空间System.Xml

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(xmlString);

//创建查询XML文件的XPath

string xPath = "/Persons/Person";

//查询Person元素

XmlNodeList queryNodes = xmlDoc.SelectNodes(xPath);

foreach (XmlNode node in queryNodes)

{

//查询名字为李四的元素

foreach (XmlNode childNode in node.ChildNodes)

{

if (childNode.InnerXml=="李四")

{

Console.WriteLine("姓名为: " + childNode.InnerXml + "  Id 为:" + node.Attributes["Id"].Value);

}

}

}

}

//使用LINQ来对XML文件进行查询

private static void UsingLinqToXMLQuery()

{

Console.WriteLine("使用LINQ来对XML文件进行查询");

//相同的步骤,导入XML文件,需要导入命名空间 System.Xml.Linq;

XElement xmlDoc=XElement.Parse(xmlString);

//创建查询,获取姓名为"李四"的元素

var queryResults = from element in xmlDoc.Elements("Person")

where element.Element("Name").Value == "李四"

select element;

// 输出查询结果

foreach (var xele in queryResults)

{

Console.WriteLine("姓名为: " + xele.Element("Name").Value + "  Id 为:" + xele.Attribute("Id").Value);

}

}

}

}