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

    整理一下Entity Framework的查询

    2012-08-30 13:41:59

    标签:Entity Framework

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://boytnt.blog.51cto.com/966121/977382

    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. //Linq形式
    6. var clients = from c in ctx.Clients 
    7.               where c.Type == 1 && c.Deleted==0 
    8.               orderby c.ID 
    9.               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. //Linq形式
    6. var clients = from c in ctx.Clients 
    7.               where c.Status == 1 
    8.               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. //Linq形式
    4. var client = (from c in ctx.Clients 
    5.             where c.ID = 100 
    6.             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. //Linq形式
    11. var clients = from c in ctx.Clients 
    12.             where c.Status == 1 
    13.             select new
    14.             { 
    15.                 c.ID, 
    16.                 c.ComputerName, 
    17.                 GroupName = (from g in ctx.Groups 
    18.                             where g.ID == c.GroupID 
    19.                             select g.Name).FirstOrDefault() 
    20.             };

    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. //Linq形式1
    12. var clients = from c in ctx.Clients 
    13.             from g in ctx.Groups 
    14.             where c.GroupID == g.ID 
    15.             orderby g.Name 
    16.             select new
    17.             { 
    18.                 c.ID, 
    19.                 c.ComputerName, 
    20.                 GroupName = g.Name 
    21.             }; 
    22. //Linq形式2
    23. var clients = from c in ctx.Clients 
    24.             where c.Status == 1 
    25.             join g in ctx.Group 
    26.             on c.GroupID equals g.ID into result 
    27.             from r in result 
    28.             order by r.Name 
    29.             select new
    30.             { 
    31.                 c.ID, 
    32.                 c.ComputerName, 
    33.                 GroupName = r.Name 
    34.             };


    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. --方案2
    8. SELECT * FROM
    9. SELECT *, ROW_NUMBER() OVER(ORDER BY ComputerName) AS RowNo 
    10. FROM [Clients] 
    11. WHERE Status=1 
    12. )t 
    13. 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. //Linq形式
    8. var clients = (from c in ctx.Clients 
    9.             orderby c.ComputerName 
    10.             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. //Linq形式
    10. var result = from c in ctx.Clients 
    11.             group c by c.Status into r 
    12.             orderby r.Count() descending 
    13.             select new
    14.             { 
    15.                 Status = r.Key, 
    16.                 Cnt = r.Count() 
    17.             };

    未完待续……

  • 相关阅读:
    loj10008家庭作业
    loj10006数列分段
    loj10005数列极差
    loj10004智力大冲浪
    codevs 1996 矿场搭建
    11.3 上午考试
    11.2 晚上考试
    11.2 下午考试
    11.2 上午考试
    11.1 下午考试
  • 原文地址:https://www.cnblogs.com/dufu/p/3961792.html
Copyright © 2011-2022 走看看