C# 返回列表的泛型方法

C# 返回列表的泛型方法,c#,generics,data-access-layer,C#,Generics,Data Access Layer,我们正在开发数据访问框架库,供业务组件调用,以访问Xamarin应用程序的SQLlite DB。 为了对DB执行SELECTSQL,编写了以下方法。我不熟悉匿名方法和使用新功能,所以需要建议 我正在寻找任何方法来提高实施的效率 private static readonly Lazy<AppDB> Lazy = new Lazy<AppDB>(() => new AppDB()); public static AppDB Instance =&

我们正在开发数据访问框架库,供业务组件调用,以访问Xamarin应用程序的SQLlite DB。 为了对DB执行SELECTSQL,编写了以下方法。我不熟悉匿名方法和使用新功能,所以需要建议 我正在寻找任何方法来提高实施的效率

 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;
            }
private static readonly Lazy Lazy=new Lazy(()=>new AppDB());
公共静态AppDB实例=>Lazy.Value;
私有SQLiteAsyncConnection _conn=null;
静态对象锁定器=新对象();
专用SQLiteAsyncConnection DbConnection
{
收到
{
如果(_conn==null)
{
确保重新初始化(ref _conn,DependencyService.Get().GetAsyncConnection);
}
返回连接;
}
}
公共列表ExecuteQuery(字符串sqlQuery,对象[]参数=null),其中T:class
{
列表l=新列表();
尝试
{
l=参数!=null?DbConnection.QueryAsync(sqlQuery,参数)。结果:DbConnection.QueryAsync(sqlQuery)。结果;
}
捕获(例外e)
{ }
返回l;
}

在catch块中,您可以将null值分配给list,以便根据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
}
public List ExecuteQuery(字符串sqlQuery,对象[]参数=null),其中T:class
{
尝试
{
var l=parameters!=null?DbConnection.QueryAsync(sqlQuery,parameters)。结果:DbConnection.QueryAsync(sqlQuery)。结果;
返回l;
}
捕获(例外e)
{ 
投
//或者抛出新的MyCustomRepositoryException(e);
}
}
//用法:
尝试
{
var documents=myClass.ExecuteQuery(…);
}
catch(Exception ex)//或catch(MyCustomRepositoryException ex)
{
//在发生错误的情况下,执行系统预期的操作
}
技术上,您可以忽略错误并返回
null
new List
,但在大多数情况下,它在体系结构上是错误的:

  • “给我列表或抛出异常”是返回值为
    list
    的方法的预期行为
  • 被调用者将无法区分空列表和错误(在
    列表
    的情况下)、/notfound对象或错误(在
    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();
        }
    }
}
public List ExecuteQuery(字符串sqlQuery,对象[]参数=null),其中T:class
{
if(参数!=null)
{
返回DbConnection.Query(sqlQuery,参数)
}
其他的
{
返回DbConnection.Query(sqlQuery);
}
}
或者更好的是,像这样的事情:

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();
        }
    }
}
public List ExecuteQuery(字符串sqlQuery,对象[]参数=null),其中T:class
{
使用(var dbc=new DbConnection())
{
if(参数!=null)
{
返回dbc.Query(sqlQuery,parameters).ToList();
}
其他的
{
返回dbc.Query(sqlQuery.ToList();
}
}
}

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

你有什么特别的问题?你的问题现在有点宽泛。请不要编写像
catch(异常e)
这样的代码,更不要说
catch(异常e){}
。捕获基本异常是一种错误的反模式。为什么要调用
newlist()仅在以后重新分配
l
吗?您从哪里获得
DbConnection.QueryAync(…)
来源?我添加了其他代码。。QueryAsync是SQLLiteAnconnection对象上的内置方法