从Entity Framework 4开始在ObjectContext对象上提供了2个方法能够直接执行SQL语句:ExecuteStoreQuery<T> 和 ExecuteStoreCommand。 git
一、使用ExecuteStoreQuery<T> :经过sql查询返回object实体,有有许多须要注意: github
1.sql = "select * from Payment where Vendor= @vendor";之因此能写成select *是由于Payment对象的属性和表的字段命名彻底一致,若是不一致的话,须要将表字段取别名,别名需是对象映射的属性名称。 sql
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”。 c#
3.若是sql 返回的列 多余具体化的实体属性的个数,那么EF将会忽视多出的列。 缓存
4.若是是你返回的表是映射到几个继承关系的实体类上,那么返回的行须要具体化到几个实体上,EF是没法根据识别列来将返回的行具体化到相应的继承类型上去,这是EF会抛出一个运行时的exception ide
5. 若是实体有complex Type属性,那么实体对象的实例是没法用ExecuteStoreQuery()来返回的,由于ExcuteStoreQuery()是没法返回一个 complex Type的集合的.返回单个complex type是支持的,可是返回的实体对象里包含complex type就不支持。 code
6. 能够返回实体对象属性的子集,就是说若是对于Payment表,咱们查询返回PaymentId和Amount字段,而后咱们定义一个 subPayment 实体包含PaymentId和Amount属性,而后使用ExcuteStoreQuery<subPayment>() orm
二、使用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 中的二级缓存
Performance Considerations for Entity Framework 5