zoukankan      html  css  js  c++  java
  • 整理一下Entity Framework的查询

    Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便。今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式)。


    1、简单查询:

    SQL:

    1. SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDER BY ID 

    EF:

    1. //Func形式 
    2. var clients = ctx.Clients.Where(c => c.Type == 1 && c.Deleted == 0) 
    3.             .OrderBy(c => c.ID) 
    4.             .ToList(); 
    5.  
    6. //Linq形式 
    7. var clients = from c in ctx.Clients 
    8.               where c.Type == 1 && c.Deleted==0 
    9.               orderby c.ID 
    10.               select c; 


    2、查询部分字段:

    SQL:

    1. SELECT ID,Name FROM [Clients] WHERE Status=1 

    EF:

    1. //Func形式 
    2. var clients = ctx.Clients.Where(c => c.Status == 1) 
    3.             .Select(c => new { c.ID, Name = c.ComputerName }) 
    4.             .ToList(); 
    5.  
    6. //Linq形式 
    7. var clients = from c in ctx.Clients 
    8.               where c.Status == 1 
    9.               select new { c.ID, Name = c.ComputerName }; 


    3、查询单一记录:

    SQL:

    1. SELECT * FROM [Clients] WHERE ID=100 

    EF:

    1. //Func形式 
    2. var client = ctx.Clients.FirstOrDefault(c => c.ID == 100); 
    3.  
    4. //Linq形式 
    5. var client = (from c in ctx.Clients 
    6.             where c.ID = 100 
    7.             select c).FirstOrDefault(); 


    4、LEFT JOIN 连接查询

    SQL:

    1. SELECT c.ID,c.ComputerName,g.Name GroupName  
    2. FROM [Clients] c  
    3. LEFT JOIN [Groups] g 
    4. ON c.GroupID = g.ID 
    5. WHERE c.Status=1 

    EF:

    1. //Func形式 
    2. var clients = ctx.Clients.Where(c => c.Status == 1) 
    3.             .Select(c => new  
    4.             { 
    5.                 c.ID, 
    6.                 c.ComputerName, 
    7.                 GroupName = ctx.Groups.FirstOrDefault(g => g.ID == c.GroupID).Name 
    8.             }) 
    9.             .ToList(); 
    10.  
    11. //Linq形式 
    12. var clients = from c in ctx.Clients 
    13.             where c.Status == 1 
    14.             select new 
    15.             { 
    16.                 c.ID, 
    17.                 c.ComputerName, 
    18.                 GroupName = (from g in ctx.Groups 
    19.                             where g.ID == c.GroupID 
    20.                             select g.Name).FirstOrDefault() 
    21.             }; 


    5、INNER JOIN 连接查询:

    SQL:

    1. SELECT c.ID,c.ComputerName,g.Name GroupName  
    2. FROM [Clients] c 
    3. INNER JOIN [Groups] g 
    4. ON c.GroupID = g.ID 
    5. WHERE c.Status=1 
    6. ORDER BY g.Name 

    EF:

    1. //Func形式 
    2. var clients = ctx.Clients.Where(c => c.Status == 1) 
    3.             .Join(ctx.Group, c => c.GroupID, g => g.ID, (c,g) =>  
    4.             { 
    5.                 c.ID, 
    6.                 c.ComputerName, 
    7.                 GroupName = g.Name 
    8.             }) 
    9.             .OrderBy(item => item.GroupName) 
    10.             .ToList(); 
    11.  
    12.  
    13. //Linq形式1 
    14. var clients = from c in ctx.Clients 
    15.             from g in ctx.Groups 
    16.             where c.GroupID == g.ID 
    17.             orderby g.Name 
    18.             select new 
    19.             { 
    20.                 c.ID, 
    21.                 c.ComputerName, 
    22.                 GroupName = g.Name 
    23.             }; 
    24.  
    25. //Linq形式2 
    26. var clients = from c in ctx.Clients 
    27.             where c.Status == 1 
    28.             join g in ctx.Group 
    29.             on c.GroupID equals g.ID into result 
    30.             from r in result 
    31.             order by r.Name 
    32.             select new 
    33.             { 
    34.                 c.ID, 
    35.                 c.ComputerName, 
    36.                 GroupName = r.Name 
    37.             }; 


    6、分页

    SQL:

    1. -- 方案1 
    2. SELECT TOP 10 * FROM [Clients] WHERE Status=1 
    3. AND ID NOT IN  
    4.     SELECT TOP 20 ID FROM [Clients] WHERE Status=1 
    5.     ORDER BY ComputerName 
    6. ORDER BY ComputerName 
    7.  
    8. --方案2 
    9. SELECT * FROM 
    10.     SELECT *, ROW_NUMBER() OVER(ORDER BY ComputerName) AS RowNo 
    11.     FROM [Clients] 
    12.     WHERE Status=1 
    13. )t 
    14. WHERE RowNo >= 20 AND RowNo < 30 

    EF:

    1. //Func形式 
    2. var clients = ctx.Clients.Where(c => c.Status=1) 
    3.             .OrderBy(c => c.ComputerName) 
    4.             .Skip(20) 
    5.             .Take(10) 
    6.             .ToList(); 
    7.  
    8. //Linq形式 
    9. var clients = (from c in ctx.Clients 
    10.             orderby c.ComputerName 
    11.             select c).Skip(20).Take(10); 


    7、分组统计:

    SQL:

    1. SELECT Status,COUNT(*) AS Cnt FROM [Clients]  
    2. GROUP BY Status 
    3. ORDER BY COUNT(*) DESC 

    EF:

      1. //Func形式 
      2. var result = ctx.Clients.GroupBy(c => c.Status) 
      3.             .Select(s => new 
      4.             { 
      5.                 Status = s.Key, 
      6.                 Cnt = s.Count() 
      7.             }) 
      8.             .OrderByDescending(r => r.Cnt); 
      9.  
      10. //Linq形式 
      11. var result = from c in ctx.Clients 
      12.             group c by c.Status into r 
      13.             orderby r.Count() descending 
      14.             select new 
      15.             { 
      16.                 Status = r.Key, 
      17.                 Cnt = r.Count() 
      18.             };
      19. 原文链接:http://boytnt.blog.51cto.com/966121/977382
  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/xwj517537691/p/3125897.html
Copyright © 2011-2022 走看看