在Entity Framework 中執行T-sql語句

從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 中的二級緩存

對Entity Framework應用二級緩存

Performance Considerations for Entity Framework 5

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

Entity Framework - Second Level Caching with DbContext

相關文章
相關標籤/搜索