写在之前:我想通过refector 反编译一下system.data.entity.dll(4.0 version),发现反编译出来的只有属性申明和方法声明,里面一句代码都没有,真是火大啊,试了几个.net4.0的其它dll同样也是如此,并且我的机器上的refector是最新版的,后来我觉得可能是dll的路径不对,我引用的是C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Data.Entity.dll,后来查找才知道,正确的路径是C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.Entity.dll。不过很奇怪的是这个路径下C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client\System.Data.Entity.dll反编译居然不正常。

对一个entity data model进行查询的方式除了用linq to entity,linq to object,esq,还可以用sql ,store procedure(我有做写过blog,借助EFExtension和EntityClient来实现).不过在EF1中使用sql,procedure返回entity 是比较麻烦的。不过在EF4中对于使用sql ,store procedure返回entity就方便多了,因为不用再去调用EntityClient了,因为objectcontext提供了ExecuteStoreQuery<TElement>(),所以还是说具体的情况:

1.Executing SQL Statement:如果需要直接去数据库表查询,可直接使用object context的ExecuteStoreCommand()方法。

假设数据库表payment (PaymentId,Amount,Vendor),对应entity data model有一个Payment对象,

下面的代码片段是通过object context insert payment,记得在EF1.0的是时候完成这个操作需要借助EntityClient.

图1

using (var context = new EFRecipesEntities())
           {
               string sql = @"insert into Payment(Amount, Vendor)
                              values (@Amount, @Vendor)";
               var args = new DbParameter[] {
                   new SqlParameter { ParameterName = "Amount", Value = 99.97M},
                   new SqlParameter { ParameterName = "Vendor", Value="Ace Plumbing"}
               };
               int rowCount = context.ExecuteStoreCommand(sql, args);

args = new DbParameter[] {
                   new SqlParameter { ParameterName = "Amount", Value = 43.83M},
                   new SqlParameter { ParameterName = "Vendor", Value = "Joe's Trash Service"}
               };
               rowCount += context.ExecuteStoreCommand(sql, args);
               Console.WriteLine("{0} rows inserted", rowCount.ToString());
           }

ExecuteStoreCommand()返回一个int值,影响的行数。

2.Returning Objects from a SQL Statement:通过sql查询返回object实体,这个在EF1.0我也做过练习,那时候是通过EFExtension来实现的:

下面的例子

using (var context = new EFRecipesEntities())
{
string sql = "select * from  Payment where Vendor= @vendor";
var args = new DbParameter[] {
new SqlParameter {ParameterName = "Vendor", Value = "ken"}};
var students = context.ExecuteStoreQuery<Payment >(sql, args);
}

这是一个非常简单的例子,对于ExecuteStoreQuery()有有许多需要注意:

1.sql = "select * from  Payment where Vendor= @vendor";之所以能写成select *是因为Payment对象的属性和表的字段命名完全一致,如果不一致的话,需要将表字段 取别名,别名需是对象映射的属性名称。

2.如果sql语句返回的列少于(具体化)实体的属性的个数,那么EF在具体化的时候将抛出一个异常如下图,因此将需要缺少的列补上一些没有意义的值,以保证在具体乎的时候不会报错:eg 如图1,如果sql=”select PaymentId ,Amount from Payment ” 这样使用context.ExecuteStoreQuery<Payment >(sql, args);那么会报异常,因此需要将Vendor 列补上 。

正确的sql=”select PaymentId ,Amount, null as Vendor from Payment”。

3.如果sql 返回的列 多余具体化的实体属性的个数,那么EF将会忽视多出的列。

如下的代码调试可以通过:多出的test列在具体化(materialization)的时候是会忽略掉的

string sql = "select PaymentId, Amount,Vendor,null as test from Chapter3.Payment “;

var students = context.ExecuteStoreQuery<Payment>(sql); ;
     Console.WriteLine("Payment...");

4.如果是你返回的表是映射到几个继承关系的实体类上,那么返回的行需要具体化到几个实体上,EF是无法根据识别列来将返回的行具体化到相应的继承类型上去,这是EF会抛出一个运行时的exception

图1


   图2

sing (var context = new EFRecipesEntities())
{
    string sql = "select * from Employee";
    var employee = context.ExecuteStoreQuery<Employee>(sql);                  
}

如上图模型和代码,图2是异常信息。

5.如果实体有complex Type属性,那么实体对象的实例是无法用ExecuteStoreQuery()来返回的,因为ExcuteStoreQuery()是无法返回一个complex Type的集合的.返回单个complex type是支持的,但是返回的实体对象里包含complex type就不支持。

6.可以返回实体对象属性的子集,就是说如果对于Payment表,我们查询返回PaymentId和Amount字段,然后我们定义一个subPayment 实体包含PaymentId和Amount属性,然后使用ExcuteStoreQuery<subPayment>()

3.Returning Objects from an Entity SQL Statement:通过esql返回实体对象. 这个和EF1.0没什么区别,可以去下载最新版的EF query sample

4.setting a default value in a query 在查询中设置默认值:

1.最简单的办法就是在实体的属性上设置默认值

2.就是使用匿名实体,就像这样 var employees = from e in context.Employees select new {Name = e.Name, YearsWorked = e.YearsWorked ?? 0};

3.通过sql语句,不过这需要借助DbDataRecord来实现,eg:string esql = @"select e.Name,case  when .YearsWorked is null then 0 else e.YearsWorked end as YearsWorked from Employees as e"; var employees = context.CreateQuery<DbDataRecord>(esql);

4.对于linq to entity没有相应的方法。

Entity Framework 4.0 recipes 读书笔记2 ExecuteStoreQuery()的更多相关文章

  1. 开发 ASP.NET vNext 续篇:云优化的概念、Entity Framework 7.0、简单吞吐量压力测试

    继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之后, 关于云优化和版本控制: 我本想做一下MAC和LINUX的self-ho ...

  2. [EF2]Sneak Preview: Persistence Ignorance and POCO in Entity Framework 4.0

    http://blogs.msdn.com/b/adonet/archive/2009/05/11/sneak-preview-persistence-ignorance-and-poco-in-en ...

  3. Entity Framework 5.0系列之Code First数据库迁移

    我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...

  4. 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性

    [索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...

  5. 在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式

    [原文地址]Using Repository and Unit of Work patterns with Entity Framework 4.0 [原文发表日期] 16 June 09 04:08 ...

  6. Entity Framework 5.0

    今天 VS2012  .net Framework 4.5   Entity Framework 5.0  三者共同发布了. ( EF5 Released ) 在介绍新特性之前,先与大家回顾一下EF版 ...

  7. 云优化的概念、Entity Framework 7.0、简单吞吐量压力测试

    云优化的概念.Entity Framework 7.0.简单吞吐量压力测试 继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之 ...

  8. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  9. 《玩转Django2.0》读书笔记-探究视图

    <玩转Django2.0>读书笔记-探究视图 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求 ...

随机推荐

  1. Spring(十):Spring配置Bean(三)Bean的作用域、使用外部属性文件

    Bean的作用域: 支持四种配置,分别是singleton,prototype,request,session. singleton 默认情况下在spring confinguration xml文件 ...

  2. ASP.NET MVC 重命名[命名空间]而导致的错误及发现的ASP.NET MVC Bug一枚

    使用VS2012新建了一个Asp.net mvc5的项目,并把项目的命名空间名称更改了(Src更改为UXXXXX),然后就导致了以下错误 刚开始以后是项目的属性中的命名空间没有更改过来的问题,但我在重 ...

  3. (算法)等概率选出m个整数

    题目: 从大小为n的整数数组A中随机选出m个整数,要求每个元素被选中的概率相同. 思路: n选m,等概率情况下,每个数被选中的概率为m/n. 方法: 初始化:从A中选择前m个元素作为初始数组: 随机选 ...

  4. Java 面向切面编程(Aspect Oriented Programming,AOP)

    本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架--AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下 ...

  5. JS判断页面加载完毕

    //JS判断页面加载完毕,再隐藏加载效果层,一个简单的JS加载效果. document.onreadystatechange = function () { if (document.readySta ...

  6. CSS 之 伪类及伪元素

    伪类和伪元素用起来非常的方便,在查阅资料及测试后整理下来. 一.伪类 CSS 伪类用于向某些选择器添加特殊的效果.伪类对元素进行分类是基于特征(characteristics)而不是它们的名字.属性或 ...

  7. linphone

    官方网站 源码下载: linphone, including: oRTP mediastreamer2 liblinphone linphonec linphone (gtk) git clone g ...

  8. 查看一个目录是否已经mount --bind

    执行 mountpoint -q /test/mount echo $? 如果是0表示已经mount mountpoint -q /test/mount || mount -o bind /some/ ...

  9. 【树莓派】【网摘】树莓派与XBMC及Kodi、LibreELEC插件(三)

    之前的相关文章参考: [树莓派]树莓派与XBMC及Kodi.LibreELEC插件(一) [树莓派]树莓派与XBMC及Kodi.LibreELEC插件(二) [树莓派]树莓派与XBMC及Kodi.Li ...

  10. Hello World程序演示Qt项目的建立、编译、运行和发布

    一.Qt项目的建立 1.选择项目模板. 选择"文件-->新建文件或工程",在选择模板页面选择Qt C++项目中的"Qt Gui应用"一项,然后单击&quo ...