Asp.net 使用Dapper在数据库中执行动态实体
我的用户从客户端项目发送动态实体,所以,我必须编写如下方法Asp.net 使用Dapper在数据库中执行动态实体,asp.net,asp.net-core,dapper,Asp.net,Asp.net Core,Dapper,我的用户从客户端项目发送动态实体,所以,我必须编写如下方法 public Task<TUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new NotImplementedException();
public Task<TUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
throw new NotImplementedException();
//string sql = "SELECT * FROM \"IdentityUsers\" WHERE \"NormalizedUserName\" = @NormalizedUserName;";
//using (var connection = _databaseConnectionFactory.CreateConnectionAsync())
//{
// connection.QueryFirstOrDefaultAsync<TUser>(sql,
// new { NormalizedUserName = normalizedUserName });
//}
}
public Task FindByNameAsync(字符串normalizedUserName,CancellationToken CancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
抛出新的NotImplementedException();
//string sql=“从\“IdentityUsers\”中选择*,其中\“NormalizedUserName\”=@NormalizedUserName;”;
//使用(var connection=\u databaseConnectionFactory.CreateConnectionAsync())
//{
//connection.QueryFirstOrDefaultAsync(sql,
//新的{NormalizedUserName=NormalizedUserName});
//}
}
MyIDatabaseConnectionFactory类绑定连接字符串如下:
public interface IDatabaseConnectionFactory
{
Task<IDbConnection> CreateConnectionAsync();
}
public class ConnectionFactory : IDatabaseConnectionFactory
{
private readonly string _connectionString;
public ConnectionFactory(string connectionString) => _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
public async Task<IDbConnection> CreateConnectionAsync()
{
try
{
var connString = new NpgsqlConnection(_connectionString);
await connString.OpenAsync();
return connString;
}
catch
{
throw;
}
}
}
公共接口IDatabaseConnectionFactory
{
任务CreateConnectionAsync();
}
公共类连接工厂:IDatabaseConnectionFactory
{
私有只读字符串_connectionString;
public ConnectionFactory(string connectionString)=>\u connectionString=connectionString??抛出新参数nullexception(nameof(connectionString));
公共异步任务CreateConnectionAsync()
{
尝试
{
var connString=新的NpgsqlConnection(_connectionString);
等待connString.OpenAsync();
返回字符串;
}
抓住
{
投掷;
}
}
}
现在,如何使用泛型类型entityTUser执行以下查询
string sql = "SELECT * FROM \"IdentityUsers\" WHERE \"NormalizedUserName\" = @NormalizedUserName;";
using (var connection = _databaseConnectionFactory.CreateConnectionAsync())
{
connection.QueryFirstOrDefaultAsync<TUser>(sql,
new { NormalizedUserName = normalizedUserName });
}
string sql=“从\“IdentityUsers\”中选择*,其中\“NormalizedUserName\”=@NormalizedUserName;”;
使用(var connection=\u databaseConnectionFactory.CreateConnectionAsync())
{
connection.QueryFirstOrDefaultAsync(sql,
新的{NormalizedUserName=NormalizedUserName});
}
注意:QueryFirstOrDefaultAsync未在此处的连接下找到您没有等待
CreateConnectionAsync
。不幸的是,这种情况并不明显,因为任务
是一次性的(因此使用
不会抱怨);请尝试:
使用(var connection=await\u databaseConnectionFactory.CreateConnectionAsync())
{
var user=await connection.QueryFirstOrDefaultAsync(sql,
新的{NormalizedUserName=NormalizedUserName});
}
提示:编译器输出(针对原始代码)有助于明确这一点:
错误CS1929“Task
”不包含“QueryFirstOrDefaultAsync
”和最佳扩展方法重载“SqlMapper”的定义。QueryFirstOrDefaultAsync(IDbConnection,string,object,IDbTransaction,int?,CommandType?
”需要类型为“IDbConnection
”的接收器
这告诉我们:
- 它找到了一些
方法,但它不可用,因为QueryFirstOrDefaultAsync
- 目标表达式是
,而不是任务
IDB连接
作为旁注:值得一提的是,如果您只对连接执行一个操作,Dapper可以为您打开和关闭连接,这有助于减少异步/等待操作的数量。例如,如果您有一个<代码> CREATECOFED连接()/<代码>方法> <强>没有< /强>打开连接,因此不需要是异步的;以下措施仍然有效:
使用(var connection=\u databaseConnectionFactory.CreateClosedConnection())
{
var user=await connection.QueryFirstOrDefaultAsync(sql,
新的{NormalizedUserName=NormalizedUserName});
}
使用Dapper处理
wait OpenAsync()
作为QueryFirstOrDefaultAsync
的一部分,如果找不到,听起来您缺少使用Dapper的代码>在顶部,不是吗?@MarcGravell不,亲爱的,用简洁的语言;存在于文件中。