2010-12-16 11 views
17

¿Cuál es la mejor práctica para convertir el resultado de LINQ-Query en un nuevo DataTable?
¿puedo encontrar una solución mejor que foreach cada resultado?Mejor práctica: Convertir el resultado de la consulta de LINQ a una tabla de datos sin bucle

EDITAR 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: tengo excepción:

secuencia local no se puede utilizar en LINQ a la implementación de SQL de operadores de consulta excepto el contains() operador.

mientras trato de ejecutar la consulta y encontré la solución aquí IEnumerable.Except wont work, so what do I do?
y Need linq help

Respuesta

26

uso de LINQ to conjunto de datos. Desde el MSDN: Creating a DataTable From a Query (LINQ to DataSet)

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

// Create a table from the query. 
DataTable boundTable = query.CopyToDataTable<DataRow>(); 

Si usted tiene los tipos anónimos:

del Blog Coder: Using Linq anonymous types and CopyDataTable

En él se explica cómo utilizar How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow

+1

lo que si la consulta se contiene 'seleccionar nueva {fld1, fld2, fld3}', entonces no puede convertirlo a IEnumerable? –

+0

http://ayende.com/Blog/archive/2007/05/09/Converting-an-object-collection-to-a-DataSet.aspx – Hao

1

Uso System.Reflection y iterate de MSDN para cada registro en el objeto de consulta.

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 
2

la conversión Resultado de la consulta en tablas de datos función genérica

DataTable ddt = new DataTable(); 

ddt = LINQResultToDataTable(query); 

    public DataTable LINQResultToDataTable<T>(IEnumerable<T> 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; 
    } 
+0

Agregue algunas explicaciones –

1

estoy usando el paquete morelinq.2.2.0 en aplicación web asp.net, consola Nuget gestor de paquetes

PM> Install-Package morelinq 

Espacio de nombres

using MoreLinq; 

Mi muestra almacenada sp_Profile procedimiento() que devuelve detalles de perfil

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