基本用法
下面是一些 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 查詢。希望這對你有所幫助!