返回列表的通用方法
问题描述:
我们正在开发数据访问框架库以供业务组件调用以访问Xamarin应用程序的SQLlite数据库。 要针对DB执行SELECT Sql,请遵循以下方法。对于匿名方法和使用新功能来说很陌生,所以需要建议 我期待反正可以提高此实现的效率。返回列表的通用方法
private static readonly Lazy<AppDB> Lazy = new Lazy<AppDB>(() => new AppDB());
public static AppDB Instance => Lazy.Value;
private SQLiteAsyncConnection _conn =null;
static object locker = new object();
private SQLiteAsyncConnection DbConnection
{
get
{
if (_conn == null)
{
LazyInitializer.EnsureInitialized(ref _conn, DependencyService.Get<ISQLite>().GetAsyncConnection);
}
return _conn;
}
}
public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T: class
{
List<T> l = new List<T>();
try
{
l = parameters !=null ? DbConnection.QueryAsync<T>(sqlQuery,parameters).Result : DbConnection.QueryAsync<T>(sqlQuery).Result;
}
catch (Exception e)
{ }
return l;
}
答
在catch块中,您可以为列表分配空值,以便您可以基于null条件在屏幕上执行正确的消息和错误处理。
catch (Exception e)
{
l = null;
//You can log the exception details in windows event viewer to see complete details.
}
答
您应该重新抛出异常或抛出新的异常并在您调用它时捕获它。
public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T: class
{
try
{
var l = parameters !=null ? DbConnection.QueryAsync<T>(sqlQuery,parameters).Result : DbConnection.QueryAsync<T>(sqlQuery).Result;
return l;
}
catch (Exception e)
{
throw;
// or throw new MyCustomRepositoryException(e);
}
}
// Usage:
try
{
var documents = myClass.ExecuteQuery<Document>(...);
}
catch (Exception ex) // or catch (MyCustomRepositoryException ex)
{
// do whatever your system is expected to do in case of error
}
Tehnically,你可以忽略的错误并返回null
或new List<T>
,但在大多数情况下,它在结构上是错误的:
- “给我列表或抛出异常”是一个方法的预期行为与
List<T>
返回值 - 被叫方将不能区分空列表和错误(在
List<T>
情况下)/未找到对象或错误(在T
情况) - 它增加了
DbConnection
的一些要求,它应该是可以恢复的。某些对象无法从异常中恢复,因此,你可以尝试继续在故障状态与对象的工作 - 它并不能保证停止执行代码,它可能会导致被调用方法意外的行为或代码
- 等甚至其他地方。
答
你的代码应该是更多这样的:
public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T : class
{
if (parameters != null)
{
return DbConnection.Query<T>(sqlQuery, parameters)
}
else
{
return DbConnection.Query<T>(sqlQuery);
}
}
或者更好的是,这样的事情:
public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T : class
{
using (var dbc = new DbConnection())
{
if (parameters != null)
{
return dbc.Query<T>(sqlQuery, parameters).ToList();
}
else
{
return dbc.Query<T>(sqlQuery).ToList();
}
}
}
现有代码中存在如此多的问题。如果你真的想得到一些好的指导,你应该发布更多的代码。
+0
我添加了额外的代码.. QueryAsync是SqlliteAsynconnection对象的内置方法 – Sarav
你有什么问题具体?你的问题现在有点宽泛。 – Maxime
请不要编写像catch(Exception e)这样的代码,更不要说catch(Exception e){}'。捕捉基本异常是一种糟糕的反模式。 – Enigmativity
你为什么叫'新列表();'只是为了重新分配'l'呢? –
Enigmativity