Best Practice: Converti il ​​risultato della query LINQ in un DataTable senza eseguire il loop

Qual è la procedura migliore per convertire il risultato LINQ-Query in un nuovo DataTable ?
posso trovare una soluzione migliore di foreach ogni elemento di risultato?

EDIT AnonymousType

 var rslt = from eisd in empsQuery join eng in getAllEmployees() on eisd.EMPLOYID.Trim() equals eng.EMPLOYID.Trim() select new { eisd.CompanyID, eisd.DIRECTID, eisd.EMPLOYID, eisd.INACTIVE, eisd.LEVEL, eng.EnglishName }; 

EDIT 2: ho ottenuto l’eccezione:

La sequenza locale non può essere utilizzata nell’implementazione LINQ to SQL degli operatori di query, ad eccezione dell’operatore Contains ().

mentre provo ad eseguire la query e ho trovato la soluzione qui IEnumerable.Except non funzionerà, quindi cosa devo fare?
e ho bisogno di aiuto linq

Usa Linq su Dataset. Da MSDN: creazione di una tabella dati da una query (da LINQ a DataSet )

 // Query the SalesOrderHeader table for orders placed // after August 8, 2001. IEnumerable query = from order in orders.AsEnumerable() where order.Field("OrderDate") > new DateTime(2001, 8, 1) select order; // Create a table from the query. DataTable boundTable = query.CopyToDataTable(); 

Se hai tipi anonimi:

Dal blog Coder: utilizzo dei tipi anonimi Linq e CopyDataTable

Spiega come utilizzare MSDN Come: Implementare CopyToDataTable Dove il tipo generico T non è una DataRow

Conversione del risultato della query nella funzione generica DataTables

  DataTable ddt = new DataTable(); ddt = LINQResultToDataTable(query); public DataTable LINQResultToDataTable(IEnumerable Linqlist) { DataTable dt = new DataTable(); PropertyInfo[] columns = null; if (Linqlist == null) return dt; foreach (T Record in Linqlist) { if (columns == null) { columns = ((Type)Record.GetType()).GetProperties(); foreach (PropertyInfo GetProperty in columns) { Type colType = GetProperty.PropertyType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>))) { colType = colType.GetGenericArguments()[0]; } dt.Columns.Add(new DataColumn(GetProperty.Name, colType)); } } DataRow dr = dt.NewRow(); foreach (PropertyInfo pinfo in columns) { dr[pinfo.Name] = pinfo.GetValue(Record, null) == null ? DBNull.Value : pinfo.GetValue (Record, null); } dt.Rows.Add(dr); } return dt; } 

Sto usando il pacchetto morelinq.2.0.0 nell’applicazione web asp.net, la console del gestore pacchetti Nuget

 PM> Install-Package morelinq 

Spazio dei nomi

 using MoreLinq; 

La mia stored procedure campione sp_Profile () che restituisce i dettagli del profilo

 DataTable dt = context.sp_Profile().ToDataTable(); 

Usa System.Reflection e iterate per ogni record nell’object query.

 Dim dtResult As New DataTable Dim t As Type = objRow.GetType Dim pi As PropertyInfo() = t.GetProperties() For Each p As PropertyInfo In pi dtResult.Columns.Add(p.Name) Next Dim newRow = dtResult.NewRow() For Each p As PropertyInfo In pi newRow(p.Name) = p.GetValue(objRow,Nothing) Next dtResult.Rows.Add(newRow.ItemArray) Return dtResult