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

1、简单查询:

SQL:

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

EF:

//Func形式
var clients = ctx.Clients.Where(c => c.Type == 1 && c.Deleted == 0)
.OrderBy(c => c.ID)
.ToList(); //Linq形式
var clients = from c in ctx.Clients
where c.Type == 1 && c.Deleted==0
orderby c.ID
select c;

2、查询部分字段:

SQL:

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

EF:

//Func形式
var clients = ctx.Clients.Where(c => c.Status == )
.Select(c => new { c.ID, Name = c.ComputerName })
.ToList(); //Linq形式
var clients = from c in ctx.Clients
where c.Status ==
select new { c.ID, Name = c.ComputerName }; :

3、查询单一记录:

SQL:

SELECT * FROM [Clients] WHERE ID=100 

EF:

//Func形式
var client = ctx.Clients.FirstOrDefault(c => c.ID == ); //Linq形式
var client = (from c in ctx.Clients
where c.ID =
select c).FirstOrDefault();

4、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:

//Func形式
var clients = ctx.Clients.Where(c => c.Status == )
.Select(c => new
{
c.ID,
c.ComputerName,
GroupName = ctx.Groups.FirstOrDefault(g => g.ID == c.GroupID).Name
})
.ToList(); //Linq形式
var clients = from c in ctx.Clients
where c.Status ==
select new
{
c.ID,
c.ComputerName,
GroupName = (from g in ctx.Groups
where g.ID == c.GroupID
select g.Name).FirstOrDefault()
};

5、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:

/Func形式
var clients = ctx.Clients.Where(c => c.Status == )
.Join(ctx.Group, c => c.GroupID, g => g.ID, (c,g) =>
{
c.ID,
c.ComputerName,
GroupName = g.Name
})
.OrderBy(item => item.GroupName)
.ToList(); //Linq形式1
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
}; //Linq形式2
var clients = from c in ctx.Clients
where c.Status ==
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
};

6、分页

SQL:

-- 方案1
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 --方案2
SELECT * FROM
(
SELECT *, ROW_NUMBER() OVER(ORDER BY ComputerName) AS RowNo
FROM [Clients]
WHERE Status=1
)t
WHERE RowNo >= 20 AND RowNo < 30

EF:

//Func形式
var clients = ctx.Clients.Where(c => c.Status=)
.OrderBy(c => c.ComputerName)
.Skip()
.Take()
.ToList(); //Linq形式
var clients = (from c in ctx.Clients
orderby c.ComputerName
select c).Skip().Take();

7、分组统计:

SQL:

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

EF:

//Func形式
var result = ctx.Clients.GroupBy(c => c.Status)
.Select(s => new
{
Status = s.Key,
Cnt = s.Count()
})
.OrderByDescending(r => r.Cnt); //Linq形式
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()
};

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

Entity Framework查询的更多相关文章

  1. Entity Framework查询原理

    Entity Framework查询原理 前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Rela ...

  2. Entity Framework查询生成大量的子查询,如何避免?求救

    最近使用Entity Framework做一个中型的项目,一张表含有千万条数据,并没有使用很复杂的查询,只是程序上使用了DTO进行帅选数据,且使用了分页,效果很不理想.经过跟踪sql,我发现很多简单的 ...

  3. 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log

    ADO.NET Entity Framework ToTraceString  //输出单条查询 DbContext.Database.Log  //这里有详细的日志

  4. C# Entity Framework查询小技巧 NoTracking

    在使用Entity Framework做查询的时候,如果只需要显示,而不用保存实体,那么可以用AsNoTracking()来获取数据. 这样可以提高查询的性能. 代码如下: var context = ...

  5. Entity Framework查询注意

    首先我们看下where的方法,直接查看定义(定义如下),其实一种是对IEnumerable的扩展,一种是对IQueryable的扩展,直接看最常用的,其实区别就在IEnumerable的扩展的参数是系 ...

  6. [原创]Entity Framework查询原理

    前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.Ent ...

  7. 解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...

  8. 一个最简单的使用Entity Framework 查询SQL 数据库的例子

    1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Ent ...

  9. Entity Framework查询,EF执行SQl

    一.简介 EF 支持开放底层的 ADO.NET 框架,DbContext有三种常用方法 DbSet.SqlQuery //查询并返回Entities DbContext.Database.SqlQue ...

随机推荐

  1. apt-get 详解&&配置阿里源

    配置apt-get的下载源 1.复制原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.编辑源列表文件 sudo vim / ...

  2. 深入理解Fabric环境搭建的详细过程

    博主之前的文章都是教大家怎么快速的搭建一个Fabric的环境,但是其中大量的工作都隐藏到了官方的脚本中,并不方便大家深入理解其中的过程,所以博主这里就将其中的过程一步步分解,方便大家! 前面的准备工作 ...

  3. 洛谷 P1908 逆序对

    \[传送门qwq\] 题目描述 猫猫\(TOM\)和小老鼠\(JERRY\)最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,\(TOM\)老猫查阅 ...

  4. Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

    SpringBoot启动时的异常信息如下: "C:\Program Files\Java\jdk1.8.0_161\bin\java" ......... com.fangxing ...

  5. zsh : command not found pip3 的解决方案

    问题描述 在 zsh 中执行 pip xxx ,出现错误 zsh: command not found: pip3 . 当然我很确定自己是有安装 pip3 的,应该是应该切换了shell,导致环境变量 ...

  6. 控制结构(9): 管道(pipeline)

    // 上一篇:线性化(linearization) // 下一篇:指令序列(opcode) 最近阅读了酷壳上的一篇深度好文:LINUX PID 1 和 SYSTEMD.这篇文章介绍了systemd干掉 ...

  7. 其它综合-运维老鸟分享linux运维发展路线规划

    运维老鸟分享linux运维发展路线规划 linux 运维发展路线常见的就是下面两条路线: 第一条:运维应用-->系统架构-->运维开发-->系统开发 第二条:运维应用-->应用 ...

  8. 不用Ajax时的传参方法

    不用Ajax时的怎么传参 创建一个form表单 function test(){ var params = { "参数名": "参数值" }; postExce ...

  9. MYSQL实战-------丁奇(极客时间)学习笔记

    1.基础架构:一条sql查询语句是如何执行的? mysql> select * from T where ID=10: 2.基础架构:一条sql更新语句是如何执行的? mysql> upd ...

  10. Bigtable:A Distributed Storage System for Strctured Data

    2006 年10 月Google 发布三架马车之一的<Bigtable:A Distributed Storage System for Strctured Data>论文之后,Power ...