在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版本的官方文档,以获取最新和最详细的信息。