4.8 执行手动查询

有很多原因决定你会手动写查询。或许由EF生成的SQL太慢,又或许执行起来浪费了太多资源。另一种情况可能是当你动态生成一个如此复杂的查询,创建SQL代码比使用LINQ to Entities简单。

在这种情况下,你自己可以使用ObjectContext类的ExecuteStoreQuery<T>创建一个SQL命令。它允许你发出任意的查询并将查询结果映射到类。它的使用如下:

var details = ctx.ExecuteStoreQuery<OrderDetail>("Select * from OrderDetail");

就是这么简单。查询被执行,列自动映射到实体。关于映射阶段有一个小小的提示:它绕过了EDM,而是使用另外一种基于属性-列名匹配的机制。这一行为如图:

这个映射解决方案的有一定的局限性:

1.如果一个属性跟相应的列名称不同,映射就不会执行并抛出异常。你可以很容易的通过在查询中使用AS SQL子句重命名列解决这个问题。
2.不能映射到有复杂属性的实体,因为没有办法将复杂属性内的名称和列进行匹配。

当然,你可以映射返回的数据到任何类型的类,不仅仅是那些定义在EDM中的。假设,你创建了一个类OrderDetailProjection,有Quantity,UnitPrice和Discount属性。你可以写一个查询,从OrderDetail表中取出Quantity, UnitPrice和 Discount列,并将结果映射到OrderDetailProjection。

public class OrderDetailProjection
{public int Quantity { get; set; }public decimal UnitPrice { get; set; }public decimal Discount { get; set; }
}
var details = ctx.ExecuteStoreQuery<OrderDetailProjection>("Select quantity, unitprice, discount from OrderDetail");

注意:

通过ExecuteStoreQuery<T>,你也可以启动存储过程。但是我们不建议这样做,因为EF本身就支持存储过程并且提供了比ExecuteStoreQuery<T>更多的选项。

如果查询带有参数,你可以使用ExecuteStoreQuery<T>的重载方法,它接受参数列表。这可能会非常棘手,所以让我们看一看。

4.8.1 带参数的查询

当初EF团队设计如何传递参数时,有很多的选择。通过选择,现在有两种操作参数的方式。

1.使用带有编号列表,跟String.Format方法一样。
2.使用ADO.NET语法

下面,我们详细看一下这两种方式。

使用带编号的列表

这是最简单的办法。在SQL查询中,将数字放在花括号中代表参数。然后,你在方法的第二个参数中传递参数。参数既可以是简单的数值也可以是DbParameter类的实例。这里有一些建议,要牢记:

1.如果你使用DbParameter实例,你必须使用与数据库Provider相应的具体类型。例如,如果对SQL Server就必须使用SqlParameter,对OLE DB就必须使用OleDbParameter。如果你使用其他的实例,在运行时会得到InvalidCastException。

2.如果你有多个参数,你不能混用DbParameter实例和纯值。你必须选择其一。否则,在运行时会得到InvalidOperationException。

3.如果你使用简单的数值作为参数,它们传过来的顺序必须和它们在查询中的顺序一样。

使用简单数值传递参数

var names = ctx.ExecuteStoreQuery<string>("SELECT name FROM company WHERE shippingcity = {0} and billingcity = {1}", "New York", "Seattle");

使用SqlParameter传递参数

var p0 = new SqlParameter("p0", DbType.String) { Value = "New York" };
var p1 = new SqlParameter("p1", DbType.String) { Value = "Seattle" };
var names = ctx.ExecuteStoreQuery<string>("SELECT name FROM company WHERE shippingcity = {0} and billingcity = {1}", p0, p1);

正如你所见,这里没有什么特别困难的。只要注意我们前面提到的陷阱即可。

注意:

即使此语法可能会导致你认为可以通过SQL注入攻击的影响,但绝对不是这种情况。参数往往作为安全的方式传递给数据库。

现在,让我们继续谈谈使用传统的参数

使用传统的参数

通过经典的ADO.NET写查询时,你通常写这样的东西表达参数:

SELECT * FROM table WHERE id = @id

这种语法对SQL Server provider是有效的。如果你使用OLE DB provider,你必须问号(?)代替@paramname。

这种方法使用ExecuteStoreQuery<T>方法仍然完全有效。不是将数字放在花括号中,而是放置参数。其他都一样。参数的值仍然可以作为简单数值或参数传递过来。

使用简单数值传递参数

var names = ctx.ExecuteStoreQuery<string>("SELECT name FROM company WHERE shippingcity = @p0 and billingcity = @p1","New York", "Seattle");

使用SqlParameter传递参数

var p0 = new SqlParameter("p0", DbType.String) { Value = "New York" };
var p1 = new SqlParameter("p1", DbType.String) { Value = "Seattle" };
var names = ctx.ExecuteStoreQuery<string>
("SELECT name FROM company WHERE shippingcity = @p0 and billingcity = @p1", p0, p1);

如果将这段代码和前面的代码比较,你会发现只是SQL代码中参数声明发生了改变。剩下的仍然是相同的,也就是说,没有更多的东西需要学习。

到目前为止,我们已经介绍了如何编写功能强大的查询。现在,我们换个角度思考:你有多少相关的实体需要查询?是直接检索出所有相关的实体,还是根据代码需要。这显然是一个获取(fetching)问题,它几乎独立与你写的任何查询。

转载于:https://www.cnblogs.com/nianming/archive/2011/09/16/2179238.html

Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:执行手动查询...相关推荐

  1. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:使用函数...

    4.7 使用函数 扩展LINQ to Entities查询的简便方法就是使用函数.有四种类型的函数可以应用: 规范函数-LINQ to Entities本身没有提供的一组预定义的函数. 数据库函数-一 ...

  2. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...

    4.9 加载(Fetching) 预先加载指在一个查询中加载所有的实体和关联的数据.延迟加载指使用时再加载关联的实体.预先加载是检索数据最高效的方法.尽管它从数据库中检索所有的数据,但是只访问一次数据 ...

  3. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:排序和连接数据...

    4.4排序(Sorting) 基本需求:用户想数据根据送货城市和邮政编码排序. 解决方案:知道LINQ有一个扩展方法可以根据一个或多个属性排序你一定会很高兴.LINQ to Entities提供了这个 ...

  4. Entity Framework 4 in Action读书笔记——第三章:查询对象模型基础(1)

    本章要点: 1.EF查询技术. 2.捕捉生成的SQL. 3.深入理解EF查询引擎. 4.常见的查询陷阱. 一.查询引擎入口点 对象服务层最重要的类是ObjectContext.在你的代码中它是最有用的 ...

  5. Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)

    objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者 ...

  6. Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(一)

    本章内容包括: 理解实体状态 理解状态的转换 自动和手动改变状态 我们先从分析实体的生命周期和它的状态开始. 实体生命周期 在其生存期期间,一个实体只有一个状态.在了解如何检索状态之前,先看看什么是实 ...

  7. Entity Framework 4 in Action 读书笔记——开篇

    写在开篇之前 Entity Framework 4 In Action 这本书目前还没有中文版的,大体看了一下目录感觉还不错,如果想从中学到东西还是看原汁原味的好.从淘宝上搜了一下这本书要将近100块 ...

  8. Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Framework(2)...

    上一篇讲解了通用数据容器,这一篇使用类来组织数据. 类是面向对象编程语言的基础.使用类,你不需要知道具体的存储机制,数据源可以是数据库,Web服务,XML文件等.类提供了很多优势,尤其是在企业应用中. ...

  9. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

最新文章

  1. 因为BitMap,白白搭进去8台服务器...
  2. 自媒体人怎样快速拥有自己的APP
  3. python列表导出csv_将Python列表导出到csv
  4. 委托 匿名类 var隐式类型 匿名方法
  5. C++ 标准库类型 map
  6. Hibernate HQL基础 限定查询条件(这里面有各种条件查询)
  7. day01-计算机操作系统java编程入门
  8. [渝粤教育] 盐城工学院 无机及分析化学C 参考 资料
  9. 最新java初级高级,python基础进阶,机器学习视频资料
  10. springmvc流程_基于Spring MVC框架的Http流程分析
  11. idea编辑区光标问题
  12. Web2.0创业者面临艰难选择:出售还是发展
  13. Atitit 项目成本之道 attilax著 1.1. 循环使用 效果明显 降低50%费用 1 1.2. Diy战略(效果显著)缩短供应链 自己组合使用,效率更高 2 1.3. 扎堆战略 使用广泛
  14. Grup加密(使其不能强制更改密码)
  15. 人工势场法脱离极小值点
  16. 小程序 40163_安卓微信登入codebeenused,error40163
  17. python函数库 阶跃 信号函数 调用_使用numpy增加阶跃函数中的分辨率
  18. STM32 HAL库实现US微秒延时函数
  19. 【用户研究】【实战】——“得到”APP 可用性测试
  20. 按要求写mysql语句_根据要求写SQL 语句

热门文章

  1. springboot 禁用tomcat_Spring Boot 面试的十个问题
  2. java程序员_Java和Python的区别 好程序员帮大家解读
  3. 谷歌浏览器不能上网_谷歌浏览器插件下载及安装教程!
  4. 优启通怎么重装系统win10_重装系统失败?小编教你安全给神舟战神GX9 Pro重装win10系统方法...
  5. ios13苹方字体ttf_字体 | iOS1013 SF Compact Rounded 英文 By alex
  6. zabbix yum安装
  7. 2021年信用卡行业发展报告
  8. 互联网日报 | 5月25日 星期二 | 华为再次重申不造车;贝壳宣布左晖为公司“永远的荣誉董事长”;清华大学成立量子信息班...
  9. 面试中这样自我介绍更能抓住面试官的耳朵
  10. 产品经理如果有捷径,那可能是多读书