A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑昱曦 中级黑马   /  2012-11-9 20:39  /  1531 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  select

  对查询的结果进行投影,在子句中指定要选择的列,如上例。

  有的时候,我们只需要投影某一列,我们可以这样

  1. private static void TestSelectSingleProperty()
  2. {
  3.     var persons = GetPersons();
  4.     var query = from p in persons
  5.                 select p.Name;
  6.     foreach (var item in query)
  7.     {
  8.         Console.WriteLine(item);
  9.     }
  10. }
复制代码

  我们还可以指定要投影的列的集合,这个时候我们要用到匿名类型

  1. var query = from p in persons
  2.             select new { p.ID, p.Name };
  3. foreach (var item in query)
  4. {
  5.     Console.WriteLine("No:{0},Name:{1}",item.ID,item.Name);
  6. }
复制代码

  query中的每一项都时候一个拥有ID属性和Name属性的对象,当然有的时候实体的属性名不是我们想要的,或者是通过对属性计算得来的,那么我们可以显式指定属性名,就像下面这样:

  1. var query = from p in persons
  2.             select new
  3.             {
  4.                 UserID = p.ID,
  5.                 FriendName = p.Gender == "男" ? "Mr" : "Ms" + p.Name
  6.             };
  7. foreach (var item in query)
  8. {
  9.     Console.WriteLine("No:{0},Friendly Name:{1}", item.UserID, item.FriendName);
  10. }
复制代码
  where

  对容器内的数据进行筛选。

  1. var query = from p in persons
  2.             where p.DepartmentID == 1
  3.             select p.Name;
复制代码
  join

  类似SQL里的join,Linq中的join子句用于将两个容器的数据以某种关系进行关联。

  1. var departments = GetDepartments();
  2. var persons = GetPersons();
  3. var query = from d in departments
  4.             join p in persons on d.ID equals p.DepartmentID
  5.             select new { d, p };
复制代码

  值得注意的是join子句只能使用equals或者是not equal而不能用其他运算符(==都不行)。而equals运算符左边必须联接的左部,右边为右部,不能调换的,否则编译不能通过。

  into

  into子句用于将join或者是group子句的结果进一步持续化,包装成为一个

  System.Linq.IGrouping<TKey, TElement>

  对象,而且IGrouping继承自IEnumerable<TElement>,可以看出,IGrouping接口提供分组的键和,该键下所包含的集合。例子见group

  group

  对结果按照指定的条件进行分组

  1. var container = new List<string> { "ZhangSan", "LiSi", "Wangwu", "ZhaoLiu", "Deng" };
  2. var query = from name in container
  3.             group name by name.Length into g
  4.             select new { g.Key, Values = g };
复制代码

  例子演示了通过姓名的长度对一个姓名列表进行分组,并将分组的结果保持到局部变量g中,可以通过下面的代码将query的结果输出

  1. foreach (var group in query)
  2. {
  3.     Console.WriteLine("{0}:", group.Key);
  4.     foreach (var item in group.Values)
  5.     {
  6.         Console.WriteLine(item);
  7.     }
  8. }
复制代码
  let

  let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见

  1. var query = from p in persons
  2.             let friendlyName = p.Gender == "男" ? "Mr" : "Ms" + p.Name
  3.             select new
  4.             {
  5.                 UserID = p.ID,
  6.                 FriendName = friendlyName
  7.             };
  8. foreach (var item in query)
  9. {
  10.     Console.WriteLine("No:{0},Friendly Name:{1}", item.UserID, item.FriendName);
  11. }
复制代码
  在IEnumerable<T>上的其他扩展  Take Skip

  用于选取前XX个或者和跳过前XX个,如选择第11到20个则可以

  1. query.Skip(10).Take(10);
复制代码
  OrderBy OrderByDescending

  排序而已

  1. query.OrderBy(c => c.Length);
复制代码

  Distinct Union Intersect Except 这些单词都见过吧,分别就是取不重复,并集,交集,差集(这个貌似看看参数就明白了)

  其他扩展都在Enumerable类下面了。

  Linq的延迟加载特性

  Linq查询的执行结果是IEnumerable<T>类型,而对IEnumerable<T>,在内部,C#通过yield关键字实现迭代器达到延迟加载的目的。从而使Linq查询只是在需要的时候才会被执行。

  但是,某一些扩展方法在执行时会试图遍历整个容器,从而使延迟加载无效,如排序,聚合函数(Count,Sum,Average等。)

  1. static IEnumerable<int> InfinityInts()
  2. {
  3.     int count = 0;
  4.     while (true)
  5.         yield return count++;
  6. }
  7. public static void LazyLoad()
  8. {
  9.     var query = from i in InfinityInts()
  10.                 select i;
  11.     foreach (var i in query.Take(20))
  12.     {
  13.         Console.WriteLine(i);
  14.     }
  15. }
  16. public static void CantDoLazyLoad()
  17. {
  18.     var query = from i in InfinityInts()
  19.                 select i;
  20.     foreach (var i in query.OrderBy(i => i).Take(20))
  21.     {
  22.         Console.WriteLine(i);
  23.     }
  24. }
复制代码

  这里有个简单的例子来证明,当使用Take时候,Linq语句能正常的执行,而当我们再Linq上使用一个Order By之后,程序就卡死了,当然,这是理所应当的,在失去延迟加载的特性之后,试图对一个无穷序列排序的结果一定是outOfMemory。

  最后       文章摘自网络

  这都只是皮毛,感兴趣的同学可以自己去MSDN查看更详细的资料,最后,推荐一个工具和一个网站:

  LINQPAd(http://www.linqpad.net/)  一个非常有用的Linq学习工具

  Linq 101 微软官方的Linq样例代码

评分

参与人数 1黑马币 +3 收起 理由
刘俊红 + 3

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马