1、背景
使用CodeFirst的好處就是,建立一個業務模型Model,專注其業務邏輯就好,不必關心Model到資料庫的映射。但是我們還是忘不了SQL語句的便利,比如查詢一個自定義視圖,執行一個存儲過程。那麼有沒有辦法,讓Code First執行我們自定義的SQL語句呢?可以的。
2、方法
2.1、DbContext.Database.SqlQuery
傳回實體類型或基本類型,上下文不跟蹤實體
有兩個版本
SqlQuery(Type, String, Object[])
建立一個原始SQL查詢,該查詢将傳回給定類型的元素。該類型可以是具有與查詢傳回的列名相比對的屬性的任何類型,或者可以是簡單的原始類型。該類型不必是實體類型。即使傳回的對象類型是實體類型,上下文也永遠不會跟蹤此查詢的結果。
參數:
Type
查詢傳回的對象的類型。
sql
SQL查詢字元串。
Object[]
應用于SQL查詢字元串的參數。
傳回值
一個IEnumerable的對象時,它列舉了将執行查詢。
SqlQuery<TElement>(String, Object[])
建立一個原始SQL查詢,該查詢将傳回給定泛型類型的元素。其餘同SqlQuery(Type, String, Object[])
2.2、DbSet<TEntity>.SqlQuery(String, Object[])
建立一個原始SQL查詢,該查詢将傳回此集合中的實體。預設情況下,上下文會跟蹤傳回的實體。可以通過在傳回的DbRawSqlQuery上調用AsNoTracking來更改此設定。請注意,傳回的實體始終是該集合的類型,而不是派生類型。如果查詢的一個或多個表可能包含其他實體類型的資料,則必須适當編寫SQL查詢以確定僅傳回正确類型的實體。
3、小結
優點:可以自定義SQL語句,并可以傳回實體類型集合。
缺點:仍然要定義好傳回的實體類型。預設是不能生成匿名類型的。