Entity Framework的查询

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 == 1)

            .Select(c => new { c.ID, Name = c.ComputerName })

            .ToList();

//Linq形式

var clients = from c in ctx.Clients

              where c.Status == 1

              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 == 100);
//Linq形式
var client = (from c in ctx.Clients
            where c.ID = 100
            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 == 1)
           .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 == 1            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:

  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. };

未完待续……

时间: 2024-10-08 09:08:31

Entity Framework的查询的相关文章

整理一下Entity Framework的查询

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.D

Entity Framework异步查询和保存

EF6开始提供了通过async和await关键字实现异步查询和保存的支持(.net 4.5及更高版本).虽然不是所有的操作都能从异步中获益,但是耗时的操作.网络或IO密集型任务中,使用异步可以提升客户端性能和增强服务器的扩展性. 本文将覆盖一下主题: 实例演练异步操作 创建模型 创建同步程序 改为异步操作 实例演练异步操作 下面演练将通过对比,很容易的观察异步操作和同步操作,该演练目的不是说明何时才是异步操作的关键场景. 创建模型 下面使用CodeFirst的流程创建模型并生成数据库,不过异步方

Entity Framework之查询总结

本节针对EF当前支持的查询方式进行分析比较,和简单自定义条件查询的实现. EF的查询方式 自定义条件查询 一.EF的查询方式 EF提供的查询方式有以下几种 原始SQL查询 LINQ To Entity and Lambda ESQL 与 ObjectQuery ObjectQuery 查询生成器 1.原始SQL查询 在EF 4.1 新增加的DbContext 除了支持LINQ与Lambda查询外,新增了支持原始SQL查询,但是不支持ESQL与ObjectQuery查询. DemoDBEntiti

Entity Framework 多查询 多样写法

使用EF实现多查询,暂未考虑性能问题 2015年10月6日22:26:51 =====正文===== 我在数据库有三个表,如下图: sysMenus与sysFunction有主外键关系,而sysUserInfo则与其他二表并无关联. 我现在使用这三个表针对多种情况使用EF实现多种查询手段 方法一: include方法(或EF自身的导航属性) 查询,要的就是出数据罢了.所以我先说EF自身的导航属性,因为这也算常用方法. 我所说的导航属性就是: 模型表下方显示的,可以看到只有拥有主外键关联的表才会有

动态Entity Framework查询:Dynamic Query 介绍

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Dynamic Query是一个支持动态Entity Framework查询的库.它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找.排序.分页的这类场景的开发工作量,其设计思想是"markup is code ".通过

Entity Framework Code First实体关联数据加载

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity Framework常用处理数据关联加载的方

Entity Framework 6 开发系列 目录

2014 年开始接触 Entity Framework 6 也快两年,用它已经沉淀了一个成熟架构,也用来开发了不少大大小小的产品和项目,直到这段时间,才真正有时间来回顾,重新学习它,为让大家更加了解Entity Framework 6,以及想把这两年中,开发过程中碰到的种种问题,跟大家分享,特此想做一个Entity Framework 6 开发系列的计划 第一篇:Entity Framework 简介 第二篇:Entity Framework CodeFirst & Model 映射 第三篇:E

Entity Framework技巧系列之八 - Tip 29 – 34

提示29. 怎样避免延迟加载或Load()阅读器问题 如果你有如下这样的代码: 1 var results = from c in ctx.Customers 2 where c.SalesPerson.EmailAddress == "-" 3 select c; 4 foreach(var customer in results) 5 { 6 Console.WriteLine(customer.Name); 7 if (IsInteresting(customer)) 8 { 9

让Entity Framework不再私闯sys.databases 不自动创建数据库(转载)

原文:http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html 这里的"私闯sys.databases"是指Entity Framework默认发起的查询:SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名' 注:本文针对的是Entity Framework Code First场景,Entity Framework的版本