2008-10-20 9 views
1

Je suis complètement nouveau à LINQ en C# /. NET. Je comprends que je pourrais l'utiliser pour convertir un DataSet en un tableau/liste, suis-je capable d'aller dans la direction opposée? J'utilise NPlot pour générer un graphique des prix capturés, qui sont stockés dans une liste, où PriceInformation est une classe contenant deux doubles publics et un DateTime.Puis-je utiliser LINQ pour convertir une liste <MyObjectType> en un DataSet?

Toutes les suggestions sont les bienvenues.

Répondre

5

Il existe une méthode appelée CopyToDataTable. Cette méthode ne vous aidera si vous avez déjà un IEnumerable (DataRow)

Voilà comment je ferais ceci:

//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()); 
+0

David, merci, je vous remercie. Je vais l'essayer. – endian

1

si MyObjectType est une entité générée LINQ, et ces objets ne sont pas déjà associés à un contexte de données que vous pouvez appeler

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

Cependant, à ce moment-LINQ to SQL est pas très efficace à des mises à jour en vrac. Si myList était de 1000 éléments, vous auriez 1000 instructions d'insertion.

Pour les très grandes listes, vous pouvez convertir le List<MyObjectType> en XML et utiliser la capacité des serveurs sql à insérer en masse en utilisant xml. Vous joindriez la procédure stockée du serveur SQL au datacontext.

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

exemple de procédure stockée serveur SQL pour insérer en vrac via 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 
Questions connexes