天天看點

【EntityFramework CodeFirst】SqlQuery直接執行SQL語句1、背景2、方法3、小結

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語句,并可以傳回實體類型集合。

缺點:仍然要定義好傳回的實體類型。預設是不能生成匿名類型的。