我对C#/ .NET中的LINQ完全不熟悉。我知道我可以使用它将DataSet转换为数组/列表,我能朝相反的方向前进吗?
我正在使用NPlot生成捕获价格的图表,这些图表存储在List中,其中PriceInformation是一个包含两个公共双打和一个DateTime的类。
非常欢迎任何建议。
答案 0 :(得分:5)
有一种名为CopyToDataTable的方法。只有当你已经拥有IEnumerable(DataRow)
时,该方法才有用以下是我如何做到这一点:
//extension method to convert my type to an object array.
public static object[] ToObjectArray(this MyClass theSource)
{
object[] result = new object[3];
result[0] = theSource.FirstDouble;
result[1] = theSource.SecondDouble;
result[2] = theSource.TheDateTime;
return result;
}
//some time later, new up a dataTable, set it's columns, and then...
DataTable myTable = new DataTable()
DataColumn column1 = new DataColumn();
column1.DataType = GetType("System.Double");
column1.ColumnName = "FirstDouble";
myTable.Add(column1);
DataColumn column2 = new DataColumn();
column2.DataType = GetType("System.Double");
column2.ColumnName = "SecondDouble";
myTable.Add(column2);
DataColumn column3 = new DataColumn();
column3.DataType = GetType("System.DateTime");
column3.ColumnName = "TheDateTime";
myTable.Add(column3);
// ... Each Element becomes an array, and then a row
MyClassList.ForEach(x => myTable.Rows.Add(x.ToObjectArray());
答案 1 :(得分:1)
如果MyObjectType
是linq生成的实体,并且这些对象尚未与您可以调用的数据上下文相关联
foreach( MyObjectType value in myList )
{
dataContext.MyObkectTypes.InsertOnSubmit(value);
}
dataContext.SubmitChanges();
但是,此时linq-to-sql在批量更新方面效率不高。如果myList是1000个项目,那么你将有1000个插入语句。
对于非常大的列表,您可以将List<MyObjectType>
转换为xml并使用sql servers使用xml批量插入。您可以将sql server存储过程附加到datacontext。
string xml = CreateInsertXml( myList );
dataContext.usp_MyObjectsBulkInsertXml(xml);
通过xml批量插入的SQL Server存储过程示例
-- XML is expected in the following format:
--
-- <List>
-- <Item>
-- <PlotID>1234</PlotID>
-- <XValue>2.4</SmsNumber>
-- <YValue>3.2</ContactID>
-- <ResultDate>12 Mar 2008</ResultDate>
-- </Item>
-- <Item>
-- <PlotID>3241</PlotID>
-- <XValue>1.4</SmsNumber>
-- <YValue>5.2</ContactID>
-- <ResultDate>3 Mar 2008</ResultDate>
-- </Item>
-- </List>
CREATE PROCEDURE [dbo].usp_MyObjectsBulkInsertXml
(
@MyXML XML
)
AS
DECLARE @DocHandle INT
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @MyXML
INSERT INTO MyTable (
PlotID,
XValue,
YValue,
ResultDate
)
SELECT
X.PlotID,
X.XValue,
X.YValue,
X.ResultDate
FROM OPENXML(@DocHandle, N'/List/Item', 2)
WITH (
PlotID INT,
XValue FLOAT,
YValue FLOAT,
ResultDate DATETIME
) X
EXEC sp_xml_removedocument @DocHandle
GO