C# linq to sql

参考文章地址:http://www.cnblogs.com/yubaolee/p/BestLinqQuery.html   以下是我自己的总结:

表结构:

本文全部代码基于:UserInfo与Class两个表,其中Class中的UserId与UserInfo中的Id对应

image

linq联合查询

内联查询

内联是一个实际使用频率很高的查询,它查询两个表共有的且都不为空的部分

  1. from user in UserInfo  
  2. join c in Classes on user.Id equals c.UserId  
  3. select new  
  4. {  
  5.     user.UserName,  
  6.     user.Id,  
  7.  c.ClassName  
  8. }  

查询结果

image

左联查询

左联应该是联合查询中使用频率最高的查询。它以左表为准,进行联合查询。如果右表中不存在对应的结果,则置空。(注意:在Linq中是不存在右联连的说法,因为右联无非是把左边的表移动到右边,查询的结果与左联是一样的)

  1. from user in UserInfo    
  2. join c in Classes on user.Id equals c.UserId into temp    
  3. from c in temp.DefaultIfEmpty()    
  4. select new    
  5. {    
  6.      user.UserName,    
  7.      user.Id,    
  8.      c.ClassName    
  9. }    

查询结果

image

合并(Union)

这种查询其实也很少用,但在某些变态业务需求下会非常有用,注意查询的结果。它是合并两个表相同列数的结果,并且如果结果中有相同的行,那么只取一行记录。

  1. (  
  2.     from userinfo in UserInfo  
  3.     select new {  
  4.       Id = (System.Int32?)userinfo.Id,  
  5.       Name = userinfo.UserName  
  6.     }  
  7. ).Union  
  8. (  
  9.     from c in Classes  
  10.       select new {  
  11.       Id = (System.Int32?)c.UserId,  
  12.       Name = c.ClassName  
  13.     }  
  14. )  

查询结果

image

Linq 分组查询

分组查询(group by)也是我们在实际项目中一个常用的操作,查询操作如下:

  1. from c in Classes  
  2. group c by c.UserId into temp  
  3. select temp  

查询结果

image

注意一下查询结果,外层是一个我们常用的IQueryable<T>,里面是一个类似Dictionary的K-V集合。简单点说Group返回的是一个集合的集合,因此输出时需用双重循环。

我们在使用它的结果时,应该这样调用:

  1. var result = from c in _context.Classes  
  2.                group c by c.UserId  
  3.                into temp  
  4.                select temp;  
  5.   
  6.            foreach (var c in result)  
  7.            {  
  8.                Console.WriteLine(c.Key);  
  9.                foreach (var citem in c)  
  10.                {  
  11.                    Console.WriteLine(citem.ClassName);  
  12.                }  
  13.            }  
身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。
原文地址:https://www.cnblogs.com/birdofparadise/p/7079734.html