Entity Framework是個好東西,雖然沒有Hibernate功能強大,但使用更簡便。今天整理一下常見SQL如何用EF來表達,Func形式和Linq形式都會列出來(本人更喜歡Func形式)。sql
一、簡單查詢:spa
SQL:ip
- SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDER BY ID
EF:it
- var clients = ctx.Clients.Where(c => c.Type == 1 && c.Deleted == 0)
- .OrderBy(c => c.ID)
- .ToList();
-
- var clients = from c in ctx.Clients
- where c.Type == 1 && c.Deleted==0
- orderby c.ID
- select c;
二、查詢部分字段:class
SQL:cli
- SELECT ID,Name FROM [Clients] WHERE Status=1
EF:List
- var clients = ctx.Clients.Where(c => c.Status == 1)
- .Select(c => new { c.ID, Name = c.ComputerName })
- .ToList();
-
- var clients = from c in ctx.Clients
- where c.Status == 1
- select new { c.ID, Name = c.ComputerName }; :
三、查詢單一記錄:select
SQL:分頁
- SELECT * FROM [Clients] WHERE ID=100
EF:統計
- var client = ctx.Clients.FirstOrDefault(c => c.ID == 100);
-
- var client = (from c in ctx.Clients
- where c.ID = 100
- select c).FirstOrDefault();
四、LEFT JOIN 鏈接查詢
SQL:
- SELECT c.ID,c.ComputerName,g.Name GroupName
- FROM [Clients] c
- LEFT JOIN [Groups] g
- ON c.GroupID = g.ID
- WHERE c.Status=1
EF:
- var clients = ctx.Clients.Where(c => c.Status == 1)
- .Select(c => new
- {
- c.ID,
- c.ComputerName,
- GroupName = ctx.Groups.FirstOrDefault(g => g.ID == c.GroupID).Name
- })
- .ToList();
-
- var clients = from c in ctx.Clients
- where c.Status == 1
- select new
- {
- c.ID,
- c.ComputerName,
- GroupName = (from g in ctx.Groups
- where g.ID == c.GroupID
- select g.Name).FirstOrDefault()
- };
五、INNER JOIN 鏈接查詢:
SQL:
- SELECT c.ID,c.ComputerName,g.Name GroupName
- FROM [Clients] c
- INNER JOIN [Groups] g
- ON c.GroupID = g.ID
- WHERE c.Status=1
- ORDER BY g.Name
EF:
- var clients = ctx.Clients.Where(c => c.Status == 1)
- .Join(ctx.Group, c => c.GroupID, g => g.ID, (c,g) =>
- {
- c.ID,
- c.ComputerName,
- GroupName = g.Name
- })
- .OrderBy(item => item.GroupName)
- .ToList();
-
-
- var clients = from c in ctx.Clients
- from g in ctx.Groups
- where c.GroupID == g.ID
- orderby g.Name
- select new
- {
- c.ID,
- c.ComputerName,
- GroupName = g.Name
- };
-
- var clients = from c in ctx.Clients
- where c.Status == 1
- join g in ctx.Group
- on c.GroupID equals g.ID into result
- from r in result
- order by r.Name
- select new
- {
- c.ID,
- c.ComputerName,
- GroupName = r.Name
- };
六、分頁
SQL:
- SELECT TOP 10 * FROM [Clients] WHERE Status=1
- AND ID NOT IN
- (
- SELECT TOP 20 ID FROM [Clients] WHERE Status=1
- ORDER BY ComputerName
- )
- ORDER BY ComputerName
-
- SELECT * FROM
- (
- SELECT *, ROW_NUMBER() OVER(ORDER BY ComputerName) AS RowNo
- FROM [Clients]
- WHERE Status=1
- )t
- WHERE RowNo >= 20 AND RowNo < 30
EF:
- var clients = ctx.Clients.Where(c => c.Status=1)
- .OrderBy(c => c.ComputerName)
- .Skip(20)
- .Take(10)
- .ToList();
-
- var clients = (from c in ctx.Clients
- orderby c.ComputerName
- select c).Skip(20).Take(10);
七、分組統計:
SQL:
- SELECT Status,COUNT(*) AS Cnt FROM [Clients]
- GROUP BY Status
- ORDER BY COUNT(*) DESC
EF:
- var result = ctx.Clients.GroupBy(c => c.Status)
- .Select(s => new
- {
- Status = s.Key,
- Cnt = s.Count()
- })
- .OrderByDescending(r => r.Cnt);
-
- var result = from c in ctx.Clients
- group c by c.Status into r
- orderby r.Count() descending
- select new
- {
- Status = r.Key,
- Cnt = r.Count()
- };