在Entity Framework 中执行T-sql语句

从Entity Framework  4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery<T>ExecuteStoreCommand。

1、使用ExecuteStoreQuery<T> :通过sql查询返回object实体,有有许多需要注意:

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将会忽视多出的列。

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

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

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

2、使用ExecuteStoreCommand:这个更加灵活,你可以执行Update,Insert,Delete语句。

using (SzmbEntities entity = new SzmbEntities()) 
{    
         var item = entity.Weatherwarnings.OrderByDescending(x=>x.Id)    
                    .Where(x => x.PublishTime < now.AddDays(-14))    
                    .FirstOrDefault();    
          if (item != null)    
          {    
                string sql = "Delete FROM  [Weatherwarning] where Id < @ID";    
                 var args = new DbParameter[] {    
                    new SqlParameter { ParameterName = "ID", Value = item.Id}    
                 };    
                 entity.ExecuteStoreCommand(sql,args);    
           }    
  }

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

相关文章:

Entity Framework 和 AppFabric 中的二级缓存

对Entity Framework应用二级缓存

Performance Considerations for Entity Framework 5

https://github.com/ChrisNanda/EntityFramework.Cache

Entity Framework - Second Level Caching with DbContext

Application using Entity Framework's Code First to dynamically connect to two different databases

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序生活

Pandas GroupBy的使用

在许多情况下,我们将数据分成几组,并在每个子集上应用一些功能。在应用中,我们可以执行以下操作:

66240
来自专栏小灰灰

ForkJoin 学习使用笔记

ForkJoin 学习使用笔记 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结...

320100
来自专栏AhDung

【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码:

32030
来自专栏开发与安全

《linux c 编程一站式学习》课后部分习题解答

1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?...

48160
来自专栏蘑菇先生的技术笔记

探索c#之不可变数据类型

21340
来自专栏分布式系统和大数据处理

C#中的委托和事件 - Part.1

文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在V...

12730
来自专栏iOS技术杂谈

iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling你要知道的runtime都在这里

你要知道的runtime都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本文主要讲解...

34360
来自专栏偏前端工程师的驿站

PLT:说说Evaluation strategy

Brief                                 在学习方法/函数时,我们总会接触到 按值传值 和 引用传值 两个概念。像C#是按值传...

21660
来自专栏王硕

原 PostgreSQL的基础数据类型分析记录

21110
来自专栏Spark学习技巧

案例说明flink的udf

用户自定义函数是非常重要的一个特征,因为他极大地扩展了查询的表达能力。本文除了介绍这三种udf之外,最后会介绍一个redis作为交互数据源的udf案例。

1.7K20

扫码关注云+社区

领取腾讯云代金券