我正在制作一个复杂的应用程序(规划涉及:文章,销售,客户,制造,机器......),它使用ERP的SQL Server数据库提供的信息.
我使用了大约30个不同的相关对象,每个对象都将其信息存储在表/视图中.其中一些表有20k到100k的记录.
我需要将所有这些表转换为C#对象,以便将来无法在SQL中处理.我不需要所有的行,但是没有办法确定我需要哪些行,因为这将取决于运行时事件.
问题是关于这样做的最佳方式.我尝试了以下方法:
检索所有数据并使用a将其存储在DataSet中SqlDataAdapter,这在RAM中占用大约300mb.这里的第一个问题是:同步,但它是可以接受的,因为数据在执行期间不会发生太大变化.
然后我遍历每一行并将其转换为C#对象,存储在静态字典中以便通过密钥快速访问.问题在于创建如此多的对象(数百万)需要内存使用量高达1,4GB,这太过分了.除了内存,数据访问速度非常快.
因此,如果获取所有内存太多,我认为我需要某种laxy加载,所以我试过:
SqlDataReader我第一次需要的项目过滤来直接查询数据库,然后将它存储在静态字典中.这种方式的内存使用量是最小的,但这种方式很慢(分钟顺序)因为这意味着我需要像服务器似乎不喜欢的不同查询(低性能).最后,我尝试了一种有效的中间方法,但我不确定它是否是最佳的,我怀疑它不是:
第三种选择是填充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?
我使用大约 30 个不同对象之间的关系,每个对象的信息都存储在表/视图中。其中一些表有 20k 到 100k 条记录。
我建议针对不同类型的对象做出不同的决定。通常,具有数千条记录的表更有可能发生更改。记录较少的表出现的可能性较小。在一个项目中,我正在研究的决定是缓存在List<T>不改变的对象中(在启动时)。对于数百个实例,这应该花费不到一秒的时间。
如果您使用 linq-to-sql,在 a 中有一个本地对象List<T>并且已正确定义 FK 约束,则可以访问按IDobj.Items过滤的 Items 表。obj(在此示例中,obj 是 PK 表,Items 是 FK 表)。
这种设计也将为用户提供他们所期望的性能。当处理小型集合时,一切都是即时的(缓存)。当处理较大的集合但进行较小的选择或插入时,性能良好(使用 PK 的快速查询)。只有当您开始执行连接多个大表的查询时,您才会真正遭受痛苦;在这些情况下,用户可能会期望这一点(尽管在不了解更多用例的情况下我无法确定)。
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |