大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询。LINQ 是我最喜欢的 C# 语言特性之一。
LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询。它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询。由于这种查询并没有制造新的语言而只是在现有的语言基础上来实现,所以叫语言集成查询。
一些基础
在 C# 中,从功能上 LINQ 可分为两类:LINQ to Object 和 LINQ to XML;从语法上 LINQ 可以分为 LINQ to Object 和 LINQ 扩展方法。大多数 LINQ to Object 都可以用 LINQ 扩展方法实现等同的效果,而且平时开发中用的最多的是 LINQ 扩展方法。
LINQ to Object 多用于映射数据库的查询,LINQ to XML 用于查询 XML 元素数据。使用 LINQ 查询的前提是对象必须是一个 IEnumerable 集合(注意,为了描述方便,本文说的集合都是指 IEnumerable 对象,包含字面上的 ICollection 对象)。另外,LINQ 查询大多是都是链式查询,即操作的数据源是 IEnumerable<T1>
类型,返回的是 IEnumerable<T2>
类型。
形如下面这样的查询就是 LINQ to Object:
var list = from user in users where user.Name.Contains("Wang") select user.Id;
等同于使用下面的 LINQ 扩展方法:
var list = users .Where(u => user.Name.Contains("Wang")) .Select(u => u.id);
LINQ 查询支持在语句中间根据需要定义变量,比如取出数组中平方值大于平均值的数字:
int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var result = from number in numbers let average = numbers.Average() let squared = Math.Pow(number, 2) where squared > average select number; // 平均值为 4.5, result 为 { 3, 4, 5, 6, 7, 8, 9 }
其中的 Select 方法接收的参数用的最多的是 Func<TSource, TResult>
,它还可以接收 Func<TSource, int, TResult>
参数,示例:
var collectionWithRowNumber = collection. .Select((item, index) => new { Item = item, RowNumber =index }) .ToList();
再来看一下 LINQ to XML 的示例。假如我们有如下 XML 文件:
<?xml version="1.0" encoding="utf-8" ?> <Employees> <Employee> <EmpId>1</EmpId> <Name>Liam</Name> <Sex>男</Sex> </Employee> <Employee> <EmpId>2</EmpId> ... </Employee> </Employees>
使用 LINQ to XML 查询所有含有指定节点值的元素:
XElement xelement = XElement.Load("Employees.xml"); var els = from el in xelement.Elements("Employee") where (string)el.Element("Sex") == "Male" select el;
等同于使用 LINQ 扩展方法:
var els = xelement.Elements("Employee") .Where(el => (string)el.Element("Sex") == "Male");
LINQ to XML 操作 XML 非常方便和灵活,大家可以在具体使用的时候去探索,这里就不展开讲了。
LINQ 查询有很多方法,由于篇幅原因,就不一一列举演示了,这里只选取一些强大的查询方法,这些方法若使用非 LINQ 来实现可能会比较麻烦。
LINQ 之所以强大,是因为它可以轻松实现复杂的查询,下面我们来总结一下 C# LINQ 的强大本文来源gaodai$ma#com搞$代*码*网之处。