從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