使用带有SQLite的通用存储库进行转换困境

本文关键字:转换 困境 存储 SQLite | 更新日期: 2024-07-27 08:04:55

称呼。我正在使用通用存储库来方便访问两个不同且必要的数据存储;一个本地SQLite DB和一个远程REST WS(在C#中用于移动MonoDroid应用程序(。

interface IRepository<T>
{
  List<T> Read(ICond cond);
}
class RepositorySQL<T>: IRepository where T : new()
{
  List<T> Read(ICond cond)
  {
    sqlArgs = convertCond(cond);   // convert cond to sql arguments
    List<object[]> results = dbLayer.DBSelect(sqlARgs);  // sqlite SELECT wrapper
    List<T> returnList = new List<T>();
    for(int i=0; i < results.Count; i++)
    {
      object[] oa = results[i];
      T t = new T();
      // cast/convert oa to T
      ///////////////////////////
      t = (T)oa;                // override cast operator ???
      t = oa;                   // override = operator ???
      t.Convert(oa);            // use a method/delegate somehow ???
      returnList.Add(t);
  }
}

我的问题是我需要将每个object[]转换为T,然后再将其添加到返回List<T>,但不确定最佳方法是什么。 我的数据库层方法DBSelect构建并返回一个List<object[]>,因为这是从SqliteDataReader方法获取查询结果的最直接和通用的方法(我认为GetValue(i)(每个object[]是一行,每列是一object。我也可以通过调用GetString(i)将行存储到string[]中,但仍然会遇到转换/转换问题(。

我真的很想在这里使用通用存储库,即使静态类型的存储库将是一个快速解决方案。我也坚持使用两个存储库(我已经阅读了许多关于存储库的帖子,其中的答案指出了为什么不应该使用两个数据重复问题等......除此之外,我对任何和所有建议都持开放态度。 感谢您的帮助!

使用带有SQLite的通用存储库进行转换困境

你需要以任何方式映射。因此,这只是代码组织的问题,该代码将驻留在强类型存储库类或实体类中。

类 foo : IDataReader公共空隙构造(对象[] 行(

那么你的仓库将是其中 T:IDataReader