Skip to content

Sql query

so edited this page May 22, 2021 · 1 revision

执行Sql

对于一些极其复杂的 sql 查询,还是得依赖原生 sql,因此,Chloe 提供了原生 sql 查询接口。

获取满足条件的用户信息,将结果映射到 Person 类上:

dbContext.SqlQuery<Person>("select * from Person where Age>@age", new DbParam("@age", 18)).ToList();

获取满足条件的用户 Id:

dbContext.SqlQuery<int>("select Id from Person where Age>@age", new DbParam("@age", 18)).ToList();

支持存储过程:

dbContext.SqlQuery<Person>("Proc_Test", CommandType.StoredProcedure, new DbParam("@age", 18)).ToList();

支持dynamic:

dbContext.SqlQuery<dynamic>("select Id,Name from Person where Age>@age", new DbParam("@age", 18)).ToList();

传参方式2:

dbContext.SqlQuery<Person>("select * from Person where Id=@Id", new { Id = 1 }).ToList();

获取 DataTable:

ExecuteDataTable 扩展方法位于 https://github.com/shuxinqin/Chloe/blob/master/src/Chloe.Extension/DbSessionExtension.cs 类中。

DataTable dt = dbContext.Session.ExecuteDataTable("select * from Person where age>=@age", new { age = 18 });

SqlQueryFmt(仅.NET Core版本支持):

SqlQueryFmt 扩展方法可以执行原生sql语句,并且会自动参数化,方法定义位于 https://github.com/shuxinqin/Chloe/blob/master/src/Chloe.Extension/DbContextExtension_NETCORE.cs 类中。

int age = 18;
List<Person> persons = dbContext.SqlQueryFmt<Person>($"select * from Person where age>={age}").ToList();

//或者
FormattableString sql = $"select * from Person where age>={age}"; //此处声明变量不能是 var 或者 string,否则会生成非参数化 sql,有潜在的 sql 注入问题
users = dbContext.SqlQueryFmt<Person>(sql).ToList();

/*
 * 生成参数化 sql:
 * Int32 @P_0 = 18;
   select * from Person where age>=@P_0
 */

ado.net:

基本的 ado.net 接口定义在 DbContext.Session 对象中。

int rowsAffected = dbContext.Session.ExecuteNonQuery("update Person set Age=18 where Id=1");
IDataReader dataReader = dbContext.Session.ExecuteReader("select * from Person where Age>18");