Google Code Prettify

EF Core 的 SqlQueryRaw 更多的使用說明及使用範例

SqlQueryRaw 是 Entity Framework Core 提供的一個方法,用於執行原生 SQL 查詢並返回實體或無實體的結果。使用 SqlQueryRaw 可以讓你在使用 EF Core 時,依然可以方便地執行原生 SQL 查詢,這對於需要執行複雜查詢或者使用一些特定的 SQL 特性時非常有用。

基本用法
下面是一些 SqlQueryRaw 的使用範例和說明:

1. 返回實體類型的查詢
假設你有一個 Product 類型對應於資料庫中的 Products 表:

csharp
public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}



你可以使用 SqlQueryRaw 來執行一個簡單的 SELECT 查詢:

csharp
using (var context = new MyDbContext())
{
    var products = context.Products.FromSqlRaw("SELECT * FROM Products").ToList();
}



2. 返回無實體類型的查詢
如果查詢的結果不對應於現有的實體類型,你可以使用無實體查詢來返回一個匿名類型或者自定義的 DTO:

csharp
public class ProductDTO
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

using (var context = new MyDbContext())
{
    var products = context.Set().FromSqlRaw("SELECT Name, Price FROM Products").ToList();
}



3. 使用參數化查詢
避免 SQL 注入的最佳方法是使用參數化查詢。你可以通過傳遞參數來實現這一點:

csharp
using (var context = new MyDbContext())
{
    var productName = "Product1";
    var products = context.Products.FromSqlRaw("SELECT * FROM Products WHERE Name = {0}", productName).ToList();
}



或者使用 SqlParameter:

csharp
using (var context = new MyDbContext())
{
    var productName = new SqlParameter("@name", "Product1");
    var products = context.Products.FromSqlRaw("SELECT * FROM Products WHERE Name = @name", productName).ToList();
}



進階用法

4. 使用 DbSet 進行查詢
如果查詢結果對應於一個實體,你應該使用 DbSet 來進行查詢。這樣可以確保查詢結果會被正確地追蹤:

csharp
using (var context = new MyDbContext())
{
    var products = context.Products.FromSqlRaw("SELECT * FROM Products WHERE Price > 10").ToList();
}



5. 使用無實體查詢
無實體查詢通常用於返回 DTO 或者當查詢結果不直接映射到現有實體時:

csharp
using (var context = new MyDbContext())
{
    var products = context.Set().FromSqlRaw("SELECT Name, Price FROM Products WHERE Price > 10").ToList();
}



6. 內嵌 SQL 的執行
如果需要執行一些內嵌 SQL,像是執行存儲過程或其他非查詢操作,可以使用 ExecuteSqlRaw 方法:

csharp
using (var context = new MyDbContext())
{
    context.Database.ExecuteSqlRaw("EXECUTE dbo.MyStoredProcedure @param1, @param2", parameters);
}



注意事項
確保安全性:使用原生 SQL 查詢時,務必避免 SQL 注入。使用參數化查詢是防止 SQL 注入的最佳方法。
跟蹤與無跟蹤:如果你不需要跟蹤查詢結果(例如,查詢結果僅供讀取),可以使用 AsNoTracking 方法提高性能:

csharp
var products = context.Products.FromSqlRaw("SELECT * FROM Products").AsNoTracking().ToList();



性能考量:儘量避免頻繁使用原生 SQL 查詢,因為這可能會導致數據庫耦合和難以維護的代碼。應優先考慮使用 EF Core 的 LINQ 查詢。


這些範例和注意事項應該可以幫助你更好地理解和使用 SqlQueryRaw 進行原生 SQL 查詢。希望這對你有所幫助!