C# LINQ
[ C# 3.0/.NET 3.x 新增特性 ]
2.1 初识LINQ:类似SQL风格的代码
LINQ又称语言集成查询,它是C# 3.0的新语法。在更多的人看来,它是一种方便的查询表达式,或者说是和SQL风格接近的代码。
var maleList = from p in personList where p.Gender == true select p;
(1)LINQ表达式以"from"开始,以"select 或 group by子句"结尾;
(2)LINQ表达式的输出是一个 IEnumerable<T> 或 IQueryable<T> 集合;(注:T 的类型 由 select 或 group by 推断出来)
2.2 LINQ使用:实现除Skip和Take外的标准查询运算符的功能
(1)基本条件查询:
List<Person> personList = GetPersonList(); List<Children> childList = GetChildrenList(); // 基本条件查询 Console.WriteLine("Basic Query:"); var maleList = from p in personList where p.Gender == true select p; maleList.ToList().ForEach(m => Console.WriteLine(m.ToString()));
(2)排序条件查询:
// 排序条件查询 Console.WriteLine("Order Query:"); var orderedList = from p in personList orderby p.Age descending orderby p.Name ascending select p; orderedList.ToList().ForEach(m => Console.WriteLine(m.ToString()));
(3)连接查询:
// Join连接查询 Console.WriteLine("Join Query:"); var joinedList = from p in personList join c in childList on p.ID equals c.ParentID select new { Person = p, Child = c }; foreach (var item in joinedList) { Console.WriteLine(item.ToString()); }
(4)分组查询:
// 分组条件查询 Console.WriteLine("Group Query:"); var groupList = from p in personList group p by p.Gender; foreach (var group in groupList) { Console.WriteLine("Group:{0}", group.Key? "男":"女"); foreach(var item in group) { Console.WriteLine(item.ToString()); } }
运行结果请参考上一节标准查询运算符中相关的运行结果,或下载附件运行查看,这里不再贴图。
2.3 LINQ本质:生成对应的标准查询运算符
作为一个细心的.Net码农,我们不由得对LINQ表达式为我们做了哪些工作而好奇?于是,我们又想起了我们的“滑板鞋”—Reflector或ILSpy,去看看编译器为我们做了什么事!
(1)以上述的基本条件查询代码为例,我们看到原来编译器将LINQ生成了对应的标准查询运算符,即Where扩展方法:
(2)再来看看排序条件查询的代码,也是生成了对应的标准查询运算符,即OrderBy扩展方法:
(3)总结:LINQ编译后会生成对应的标准查询运算符(查询->Where,排序->OrderBy,连接->Join,分组->GroupBy),所以LINQ表达式其实就是类似于SQL风格的一种更加友好的语法糖而已。其本质还是扩展方法、泛型委托等“旧酒”,被一个“新瓶子”所包装了起来,就变得高大上了。
出处:http://edisonchou.cnblogs.com