使用字典插入新记录

时间:2016-01-04 09:10:53

标签: vb.net dictionary linq-to-sql insertonsubmit

是否可以插入新记录,其中值存储在字典而不是结构中?我见过这段代码:

Dim ord As New Order With _
{.OrderID = 12000, _
 .ShipCity = "Seattle", _
 .OrderDate = DateTime.Now}

' Add the new object to the Orders collection.
db.Orders.InsertOnSubmit(ord)

但我有250个奇数值/字段要添加到每个记录的数据表中,并且更喜欢使用字典而不是定义所有列字段并在类中添加值,如上例所示。可以这样做吗?

dim dctValues as new dictionary(of string,integer)
key="val" & x
'loop through calc and increase x from 1 to 250
'key goes from "val1" to "val250"
dctValues.add(key,999)
...etc for 250 fields/columns for one record
db.Orders.InsertonSubmit(dctValues)

1 个答案:

答案 0 :(得分:1)

假设InsertOnSubmit适用于词典中的每个项目,您可以通过For Each循环调用它

For Each item As MyNewClass In dct.Values
    db.Orders.InsertonSubmit(item)
Next

更难的部分是定义MyNewClass并将其放入词典中以便以后轻松处理

Dim dctValues As New Dictionary(Of String, MyNewClass) 'Note the Value is MyNewClass

编辑:

使用List,您必须先让MyNewClass仍在某处声明,并处理三个变量OrderIDShipCityOrderDate

Public Class MyNewClass
    Public OrderID As Integer
    Public ShipCity As String
    Public OrderDate As Date
End Class

但是现在添加项目时不需要放置Key

Dim list As List(Of MyNewClass) 'List declaration, later will have 250 items

然后,对于您拥有的每个对象,首先将它们放在List for loop之后,然后将其放入数据库

For Each item As MyNewClass In list
    db.Orders.InsertonSubmit(item) 'no need to submit per item, but using For Each loop
Next    

编辑2(来自评论):

如果它是DataTable,我们仍然可以解析它(因为一个DataTable意味着乘以相同class的数据。为了解决这个问题,我认为最好还是声明一个代表数据表中一行的类。但在你的情况下,一行是250列。这很多。除非我们知道每个数据的类型,否则无法正确放置行。但由于数据列的数量非常多,我可以进一步建议您执行以下两种备选方案之一:

第一种方法是将表拆分为多个表,其数据关系在第三范式中(请查看更多相关信息)。这样,您可以最小化数据的大小,并具有良好的数据关系结构。这种方式将使您最终获得几个较小的表格,但这对于可持续性和可扩展性而言是值得做的。人们考虑的第三范式的唯一成本通常是查询速度。但是,250列的100条记录不会产生这个问题。

第二种方式是使用数据表的列信息来获取每个列的数据类型。虽然列数很多,但数据类型的数量更有限。然后,您需要创建一种通用方法,将每种数据类型映射到C#中等效类型的生成数据。然后,对于250列中的所有数据,您可以使用此通用类'将其转换为VB.Net数据类型的方法&反之亦然,根据你的过程。这种方法更有效,更持久,但你可能会发现创建泛型类有点麻烦。但是这样你就不需要改变你的表了

为什么人们通过第二种方式在结构上更具结构性地修复此问题是因为可重用性。给定X列和Y记录的新案例,以前的解决方案可用于新问题。但是如果您使用这一组数据更多,那么第一种方式并不是一个糟糕的选择。或者,如果第一个和第二个都不适合你的情况,那么是的,你可能会痛苦地申报一个有250名成员的class