在C#中,使用Entity Framework (EF)框架执行原始的SQL查询语句有几种方法。以下是一些常见的方法:
使用DbContext.Database.ExecuteSqlCommand
执行非查询SQL命令
ExecuteSqlCommand
方法用于执行不返回结果集的SQL命令,如INSERT、UPDATE、DELETE等。
csharp代码using (var context = new MyDbContext())
{
string sql = "UPDATE Customers SET Age = 25 WHERE CustomerId = 1";
int rowsAffected = context.Database.ExecuteSqlCommand(sql);
}
使用DbContext.Database.SqlQuery<T>
执行查询并返回实体列表
如果你想要执行查询并获取实体列表,可以使用SqlQuery<T>
方法。这里T
是你想要将结果映射到的实体类型。
csharp代码using (var context = new MyDbContext())
{
string sql = "SELECT * FROM Customers WHERE CustomerId = 1";
var customer = context.Database.SqlQuery<Customer>(sql).FirstOrDefault();
}
使用DbSet<T>.FromSqlRaw
或DbSet<T>.FromSqlInterpolated
执行查询并返回实体列表
这些方法允许你在DbSet上执行原始的SQL查询,并返回该DbSet类型的实体列表。
csharp代码using (var context = new MyDbContext())
{
string sql = "SELECT * FROM Customers WHERE CustomerId = {0}", customerId;
var customers = context.Customers.FromSqlRaw(sql, customerId).ToList();
// 或者使用字符串插值(C# 6.0及以上版本)
var customerId = 1;
var customersInterpolated = context.Customers.FromSqlInterpolated($"SELECT * FROM Customers WHERE CustomerId = {customerId}").ToList();
}
使用DbContext.Set<T>.SqlQuery
执行查询并返回实体列表(已过时)
DbSet<T>.SqlQuery
方法现在已经被标记为过时,推荐使用FromSqlRaw
或FromSqlInterpolated
。
csharp代码// 注意:此方法已过时
using (var context = new MyDbContext())
{
string sql = "SELECT * FROM Customers WHERE CustomerId = @p0";
var customer = context.Customers.SqlQuery(sql, 1).FirstOrDefault();
}
注意事项
- 执行原始SQL查询时,请确保你信任该查询的来源,以防止SQL注入攻击。
- 使用参数化查询(如上面的
@p0
示例)可以提高安全性,并防止SQL注入。 - 当使用
FromSqlRaw
或FromSqlInterpolated
时,EF Core会尝试将查询结果映射到实体类型上。因此,请确保SQL查询选择的列与实体类型的属性匹配。 - 如果你的SQL查询很复杂或涉及多个表,可能需要创建一个DTO(数据传输对象)来映射查询结果,而不是直接使用实体类型。
根据你的需求和EF Core的版本,你可能会选择使用不同的方法来执行原始SQL查询。建议查看你所使用的EF Core版本的官方文档,以获取最新和最详细的信息。