使用字典插入新记录
Insert new record using a dictionary
是否可以在值存储在字典而不是结构中的位置插入新记录?我看过这段代码:
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 条奇数 values/fields 可以为每条记录添加到数据表中,我更愿意使用字典而不是像示例那样定义所有列字段并在 class 中添加值多于。这能做到吗?
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)
假设 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
并处理三个变量 OrderID
、ShipCity
和 OrderDate
.
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
然后对于您拥有的每个对象,首先通过 for loop
将它们放入您的 List
,然后通过
将其放入数据库
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
的乘法数据)。为了解决这个问题,我认为最好还是声明一个 class 来表示数据 table 中的一行。但是在你的情况下,一行是 250 列。这是很多。除非我们知道每个数据的类型,否则无法正确放置行。但是由于数据列的数量很多,我可以进一步建议您执行以下两个备选方案之一:
第一种方式是将table拆分为多个table,数据关系为第三范式(请查看更多相关信息) .通过这种方式,您可以最大限度地减少数据的大小,并将拥有良好的数据关系结构。这种方式将使您最终得到几个较小的 table,但为了可持续性和可扩展性,这样做是值得的。人们考虑的第三范式的唯一成本通常是查询速度。但是250列的100条记录不会出现这个问题。
第二种方法 是使用数据的列信息table 来获取每个单独列的数据类型。虽然列数很多,但数据类型的数量比较有限。然后,您需要创建一种通用方法,将每种数据类型映射到 C# 中等效类型的生成数据。然后对于 250 列中的所有数据,您使用这种通用的 class' 方法将其转换为 VB.Net 数据类型,反之亦然,根据您的 process.This 方法更有效和持久,但您创建通用 class 可能会遇到一些麻烦。但是这样你就不需要改变你的 table
为什么通常人们使用第二种方法 更结构化地解决这个问题是因为可重用性。给定具有 X 列和 Y 记录的新案例,以前的解决方案可用于解决新问题。但是如果你更多地使用这组数据,那么第一种方式是一个不错的选择。或者,如果第一个和第二个都不适合您的情况,那么是的,您可能会费力地声明一个 class
有 250 个成员
是否可以在值存储在字典而不是结构中的位置插入新记录?我看过这段代码:
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 条奇数 values/fields 可以为每条记录添加到数据表中,我更愿意使用字典而不是像示例那样定义所有列字段并在 class 中添加值多于。这能做到吗?
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)
假设 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
并处理三个变量 OrderID
、ShipCity
和 OrderDate
.
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
然后对于您拥有的每个对象,首先通过 for loop
将它们放入您的 List
,然后通过
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
的乘法数据)。为了解决这个问题,我认为最好还是声明一个 class 来表示数据 table 中的一行。但是在你的情况下,一行是 250 列。这是很多。除非我们知道每个数据的类型,否则无法正确放置行。但是由于数据列的数量很多,我可以进一步建议您执行以下两个备选方案之一:
第一种方式是将table拆分为多个table,数据关系为第三范式(请查看更多相关信息) .通过这种方式,您可以最大限度地减少数据的大小,并将拥有良好的数据关系结构。这种方式将使您最终得到几个较小的 table,但为了可持续性和可扩展性,这样做是值得的。人们考虑的第三范式的唯一成本通常是查询速度。但是250列的100条记录不会出现这个问题。
第二种方法 是使用数据的列信息table 来获取每个单独列的数据类型。虽然列数很多,但数据类型的数量比较有限。然后,您需要创建一种通用方法,将每种数据类型映射到 C# 中等效类型的生成数据。然后对于 250 列中的所有数据,您使用这种通用的 class' 方法将其转换为 VB.Net 数据类型,反之亦然,根据您的 process.This 方法更有效和持久,但您创建通用 class 可能会遇到一些麻烦。但是这样你就不需要改变你的 table
为什么通常人们使用第二种方法 更结构化地解决这个问题是因为可重用性。给定具有 X 列和 Y 记录的新案例,以前的解决方案可用于解决新问题。但是如果你更多地使用这组数据,那么第一种方式是一个不错的选择。或者,如果第一个和第二个都不适合您的情况,那么是的,您可能会费力地声明一个 class
有 250 个成员