返回列表的通用方法

时间:2017-07-18 03:05:30

标签: c# generics data-access-layer

我们正在开发数据访问框架库,由Business组件调用以访问用于Xamarin应用程序的SQLlite DB。 要对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;
            }

3 个答案:

答案 0 :(得分:1)

您的代码应该更像这样:

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();
        }
    }
}

现有代码中存在很多问题。如果你真的想得到一些好的指导,你真的应该发布更多的代码。

答案 1 :(得分:0)

在catch块中,您可以为列表分配空值,以便您可以根据空条件在屏幕上执行正确的消息和错误处理。

catch (Exception e)
{
  l = null;
  //You can log the exception details in windows event viewer to see complete details.
}

答案 2 :(得分:0)

您应该重新抛出异常或抛出新异常并在调用时捕获它。

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,您可以忽略错误并返回nullnew List<T>,但在大多数情况下,它在架构上是错误的:

  • “给我列表或抛出异常”是List<T>返回值的方法的预期行为
  • 被调用者将无法区分空列表和错误(如果是List<T>)/未找到对象或错误(如果是T
  • 它在DbConnection上添加了一些要求,它应该是可以恢复的。某些对象无法从异常中恢复,因此您可以尝试继续使用处于故障状态的对象
  • 它不保证停止代码执行,它可能导致callee方法甚至其他代码位置的意外行为