在DAL中使用Dapper我有大量重复代码:
using (var sqlConn = new NpgsqlConnection("..."))
{
sqlConn.Open();
// query
}
弄清楚如何抽象没有返回任何内容的查询很容易:
private void OpenConn(Action<NpgsqlConnection> action)
{
using (var sqlConn = new NpgsqlConnection("...")
{
sqlConn.Open();
action.Invoke(sqlConn);
}
}
你就这么称呼它:
OpenConn(x => x.Execute("INSERT INTO ..."));
但我不知道如何重写OpenConn函数,以便你可以从它返回结果,即在另一个函数内返回int:
public int Example() {
return OpenConn<int>(x => x.Query<int>("...").First());
}
或
public int Example() {
OpenConn<int>(x => return x.Query<int>("...").First());
}
答案 0 :(得分:3)
也许是这样的:
private TResult OpenConn<TResult>(Func<NpgsqlConnection, TResult> query)
{
using (var sqlConn = new NpgsqlConnection("...")
{
sqlConn.Open();
return query(sqlConn);
}
}
呼叫:
public int Example()
{
return OpenConn<int>(x => return x.Query<int>("...").First());
}
答案 1 :(得分:3)
使用此语法为OpenCon定义重载。
public int OpenConn(Func<NpgsqlConnection, int> func)
{
using (var sqlConn = new NpgsqlConnection("...")
{
sqlConn.Open();
return func(sqlConn);
}
}
OpenConn现在接收作为参数的委托给接收连接并返回整数的函数。
你称之为从OpenCon中返回查询结果
public int Example()
{
int result = OpenConn(x => return x.Query<int>("...").First());
}