Могу ли я использовать LINQ для преобразования List‹MyObjectType› в DataSet?

Я совершенно новичок в LINQ в С#/.NET. Я понимаю, что могу использовать его для преобразования набора данных в массив/список, могу ли я пойти в противоположном направлении?

Я использую NPlot для создания графика захваченных цен, которые хранятся в списке, где PriceInformation — это класс, содержащий два общедоступных двойника и DateTime.

Любые предложения очень приветствуются.


person endian    schedule 20.10.2008    source источник


Ответы (2)


Существует метод под названием 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());
person Amy B    schedule 20.10.2008

если MyObjectType является объектом, сгенерированным linq, и эти объекты еще не связаны с контекстом данных, который вы можете вызвать

foreach( MyObjectType value in myList )
{
    dataContext.MyObkectTypes.InsertOnSubmit(value);
}
dataContext.SubmitChanges();

Однако в настоящее время linq-to-sql не очень эффективен при массовых обновлениях. Если бы myList состоял из 1000 элементов, у вас было бы 1000 операторов вставки.

Для очень больших списков вы можете преобразовать List<MyObjectType> в xml и использовать возможность серверов sql для массовой вставки с использованием xml. Вы бы прикрепили хранимую процедуру сервера sql к контексту данных.

string xml = CreateInsertXml( myList );
dataContext.usp_MyObjectsBulkInsertXml(xml);

пример хранимой процедуры сервера sql для массовой вставки через xml

-- 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
person Robert Paulson    schedule 20.10.2008