Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:执行手动查询...
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查询:执行手动查询...相关推荐
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:使用函数...
4.7 使用函数 扩展LINQ to Entities查询的简便方法就是使用函数.有四种类型的函数可以应用: 规范函数-LINQ to Entities本身没有提供的一组预定义的函数. 数据库函数-一 ...
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...
4.9 加载(Fetching) 预先加载指在一个查询中加载所有的实体和关联的数据.延迟加载指使用时再加载关联的实体.预先加载是检索数据最高效的方法.尽管它从数据库中检索所有的数据,但是只访问一次数据 ...
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:排序和连接数据...
4.4排序(Sorting) 基本需求:用户想数据根据送货城市和邮政编码排序. 解决方案:知道LINQ有一个扩展方法可以根据一个或多个属性排序你一定会很高兴.LINQ to Entities提供了这个 ...
- Entity Framework 4 in Action读书笔记——第三章:查询对象模型基础(1)
本章要点: 1.EF查询技术. 2.捕捉生成的SQL. 3.深入理解EF查询引擎. 4.常见的查询陷阱. 一.查询引擎入口点 对象服务层最重要的类是ObjectContext.在你的代码中它是最有用的 ...
- Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)
objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者 ...
- Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(一)
本章内容包括: 理解实体状态 理解状态的转换 自动和手动改变状态 我们先从分析实体的生命周期和它的状态开始. 实体生命周期 在其生存期期间,一个实体只有一个状态.在了解如何检索状态之前,先看看什么是实 ...
- Entity Framework 4 in Action 读书笔记——开篇
写在开篇之前 Entity Framework 4 In Action 这本书目前还没有中文版的,大体看了一下目录感觉还不错,如果想从中学到东西还是看原汁原味的好.从淘宝上搜了一下这本书要将近100块 ...
- Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Framework(2)...
上一篇讲解了通用数据容器,这一篇使用类来组织数据. 类是面向对象编程语言的基础.使用类,你不需要知道具体的存储机制,数据源可以是数据库,Web服务,XML文件等.类提供了很多优势,尤其是在企业应用中. ...
- Machine Learning in Action 读书笔记---第5章 Logistic回归
Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...
最新文章
- 因为BitMap,白白搭进去8台服务器...
- 自媒体人怎样快速拥有自己的APP
- python列表导出csv_将Python列表导出到csv
- 委托 匿名类 var隐式类型 匿名方法
- C++ 标准库类型 map
- Hibernate HQL基础 限定查询条件(这里面有各种条件查询)
- day01-计算机操作系统java编程入门
- [渝粤教育] 盐城工学院 无机及分析化学C 参考 资料
- 最新java初级高级,python基础进阶,机器学习视频资料
- springmvc流程_基于Spring MVC框架的Http流程分析
- idea编辑区光标问题
- Web2.0创业者面临艰难选择:出售还是发展
- Atitit 项目成本之道 attilax著 1.1. 循环使用 效果明显 降低50%费用	1 1.2. Diy战略(效果显著)缩短供应链 自己组合使用,效率更高	2 1.3. 扎堆战略 使用广泛
- Grup加密(使其不能强制更改密码)
- 人工势场法脱离极小值点
- 小程序 40163_安卓微信登入codebeenused,error40163
- python函数库 阶跃 信号函数 调用_使用numpy增加阶跃函数中的分辨率
- STM32 HAL库实现US微秒延时函数
- 【用户研究】【实战】——“得到”APP 可用性测试
- 按要求写mysql语句_根据要求写SQL 语句
热门文章
- springboot 禁用tomcat_Spring Boot 面试的十个问题
- java程序员_Java和Python的区别 好程序员帮大家解读
- 谷歌浏览器不能上网_谷歌浏览器插件下载及安装教程!
- 优启通怎么重装系统win10_重装系统失败?小编教你安全给神舟战神GX9 Pro重装win10系统方法...
- ios13苹方字体ttf_字体 | iOS1013 SF Compact Rounded 英文 By alex
- zabbix yum安装
- 2021年信用卡行业发展报告
- 互联网日报 | 5月25日 星期二 | 华为再次重申不造车;贝壳宣布左晖为公司“永远的荣誉董事长”;清华大学成立量子信息班...
- 面试中这样自我介绍更能抓住面试官的耳朵
- 产品经理如果有捷径,那可能是多读书