Nat*_*ros 2 c# dapper asp.net-web-api
我是Dapper的初学者,对最佳做法有一些疑问。我的项目是Asp.net WebApi。
打开连接字符串
在此线程中,在Controller内以这种方式打开了与数据库的连接,但这是一个简单的项目,并不意味着要成为WebService:
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
Run Code Online (Sandbox Code Playgroud)
但是我发现其他带有using声明的例子:
using (IDbConnection connection = new SqlConnection(stringConnection))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
由于此项目是WebApi,因此using语句会更好,因为Dispose请求会更好吗?
上市数据
在上面的同一线程中,显示了如何基于static IDbConnection dbproperty 检索列表:
var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });
Run Code Online (Sandbox Code Playgroud)
还是会更好用.AsList()?
var res = connection.Query<ShippDetails>(query, new { id }).AsList();
Run Code Online (Sandbox Code Playgroud)
控制器的动作
对于我所有的动作,它看起来像:
[Route("FF")]
[HttpGet]
public async Task<HttpResponseMessage> get()
{
var response = new HttpResponseMessage();
int id = 1;
var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });
if (res.Count > 0)
{
response = Request.CreateResponse(HttpStatusCode.OK, res);
}
else
{
response = Request.CreateResponse(HttpStatusCode.NoContent);
}
var task = new TaskCompletionSource<HttpResponseMessage>();
task.SetResult(response);
return await task.Task;
}
Run Code Online (Sandbox Code Playgroud)
可能会导致某种延迟?还是我处理“动作”的方式是“好”?谢谢!
SqlConnection 它实际上是基于内部连接池的,因此当您创建和处置它们时,您会从池中返回并返回到池中,除非没有足够的连接,例如第一个连接。
因此,您应该将using搭配使用SqlConnection。使用静态变量来保存连接实际上很危险,因为不能保证连接的实例方法可以跨多个线程工作。
至于您通过Dapper获得的数据,.AsList()将强制传输结果。这是“我希望结果存储在内存中”的明确说明。如果您不使用它,则可能会IEnumerable<T>懒得获取每一行。
关于控制器,您正在将结果转换Query<T>为List<T>。这可能行不通,您应该坚持使用.AsList()。另一件事是您实际上没有从async控制器中获得任何好处。您应该做的var res = await db.QueryAsync<T>(...).AsList();只是return response;在最后,TaskCompletionSource<T>那里是多余的。
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |