将大量数据转换为C#对象

Pin*_*nx0 5 c#

我正在制作一个复杂的应用程序(规划涉及:文章,销售,客户,制造,机器......),它使用ERP的SQL Server数据库提供的信息.

我使用了大约30个不同的相关对象,每个对象都将其信息存储在表/视图中.其中一些表有20k到100k的记录.

我需要将所有这些表转换为C#对象,以便将来无法在SQL中处理.我不需要所有的行,但是没有办法确定我需要哪些行,因为这将取决于运行时事件.

问题是关于这样做的最佳方式.我尝试了以下方法:

  1. 检索所有数据并使用a将其存储在DataSet中SqlDataAdapter,这在RAM中占用大约300mb.这里的第一个问题是:同步,但它是可以接受的,因为数据在执行期间不会发生太大变化.

    然后我遍历每一行并将其转换为C#对象,存储在静态字典中以便通过密钥快速访问.问题在于创建如此多的对象(数百万)需要内存使用量高达1,4GB,这太过分了.除了内存,数据访问速度非常快.

因此,如果获取所有内存太多,我认为我需要某种laxy加载,所以我试过:

  1. 我考虑的另一个选择是直接通过SqlDataReader第一次需要的项目过滤来直接查询数据库,然后将它存储在静态字典中.这种方式的内存使用量是最小的,但这种方式很慢(分钟顺序)因为这意味着我需要像服务器似乎不喜欢的不同查询(低性能).

最后,我尝试了一种有效的中间方法,但我不确定它是否是最佳的,我怀疑它不是:

  1. 第三种选择是填充DataSet包含所有信息并存储本地静态副本,但不将所有行转换为对象,只需按需执行(懒惰),如下所示:

    public class ProductoTerminado : Articulo     {
    
      private static Dictionary<string, ProductoTerminado> productosTerminados = new Dictionary<string, ProductoTerminado>();
    
      public PinturaTipo pinturaTipo { get; set; }
      public ProductoTerminado(string id)
          : base(id) { }
      public static ProductoTerminado Obtener(string idArticulo)
      {
          idArticulo = idArticulo.ToUpper();
          if (productosTerminados.ContainsKey(idArticulo))
          {
            return productosTerminados[idArticulo];
          }
          else
          {
              ProductoTerminado productoTerminado = new ProductoTerminado(idArticulo);
              //This is where I get new data from that static dataset
              var fila = Datos.bd.Tables["articulos"].Select("IdArticulo = '" + idArticulo + "'").First();
              //Then I fill the object and add it to the dictionary.
              productoTerminado.descripcion = fila["Descripcion"].ToString();
              productoTerminado.paletizacion = Convert.ToInt32(fila["CantidadBulto"]);
              productoTerminado.pinturaTipo = PinturaTipo.Obtener(fila["PT"].ToString());
              productosTerminados.Add(idArticulo, productoTerminado);
              return productoTerminado;
          }
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)

那么,这是一个很好的方法,或者我应该查看实体框架或类似强类型的东西DataSet

yto*_*ano 1

我使用大约 30 个不同对象之间的关系,每个对象的信息都存储在表/视图中。其中一些表有 20k 到 100k 条记录。

我建议针对不同类型的对象做出不同的决定。通常,具有数千条记录的表更有可能发生更改。记录较少的表出现的可能性较小。在一个项目中,我正在研究的决定是缓存在List<T>不改变的对象中(在启动时)。对于数百个实例,这应该花费不到一秒的时间。

如果您使用 linq-to-sql,在 a 中有一个本地对象List<T>并且已正确定义 FK 约束,则可以访问按IDobj.Items过滤的 Items 表。obj(在此示例中,obj 是 PK 表,Items 是 FK 表)。

这种设计也将为用户提供他们所期望的性能。当处理小型集合时,一切都是即时的(缓存)。当处理较大的集合但进行较小的选择或插入时,性能良好(使用 PK 的快速查询)。只有当您开始执行连接多个大表的查询时,您才会真正遭受痛苦;在这些情况下,用户可能会期望这一点(尽管在不了解更多用例的情况下我无法确定)。