前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Entity Framework 中执行T-sql语句

在Entity Framework 中执行T-sql语句

作者头像
张善友
发布2018-01-22 15:00:33
2.4K0
发布2018-01-22 15:00:33
举报
文章被收录于专栏:张善友的专栏张善友的专栏

从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语句。

代码语言:js
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-11-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档