• 整理一下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. (
    5.     SELECT TOP 20 ID FROM [Clients] WHERE Status=1
    6.     ORDER BY ComputerName
    7. )
    8. ORDER BY ComputerName
    9.  
    10. --方案2
    11. SELECT * FROM
    12. (
    13.     SELECT *, ROW_NUMBER() OVER(ORDER BY ComputerName) AS RowNo
    14.     FROM [Clients]
    15.     WHERE Status=1
    16. )t
    17. 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.             };

    未完待续……



    原文链接:http://www.cnblogs.com/ccczqh/archive/2013/02/18/2915373.html

  • 相关阅读:
    ansible-2添加公钥
    ansible-1 的安装
    history命令显示出详细时间
    nginx配置文件详解
    oracle-7参数文件的管理
    使用gitlab+jenkins+saltstack+rsync自动部署Web应用
    tomcat配置和优化
    pip --upgrade批量更新过期的python库
    apk下载安装,存储的位置,路径
    android中的内部存储与外部存储
  • 原文地址:https://www.cnblogs.com/Percy_Lee/p/5108836.html
Copyright © 2020-2023  润新知