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

1、简单查询:

SQL:

 
  1. SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDERBY 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,NameFROM [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. LEFTJOIN [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. INNERJOIN [Groups] g 

  4. ON c.GroupID = g.ID 

  5. WHERE c.Status=1 

  6. ORDERBY 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. SELECTTOP 10 * FROM [Clients] WHERE Status=1 

  3. AND ID NOTIN

  4. SELECTTOP 20 ID FROM [Clients] WHERE Status=1 

  5. ORDERBY ComputerName 

  6. ORDERBY ComputerName 

  7. --方案2

  8. SELECT * FROM

  9. SELECT *, ROW_NUMBER() OVER(ORDERBY 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. GROUPBY Status 

  3. ORDERBYCOUNT(*) 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.             }; 

 

未完待续……

 

本文出自 “” 博客,请务必保留此出处