2014-04-28 19 views
5

Sto lavorando a un'applicazione web MVC4 con EF 6. Sto utilizzando il primo approccio al codice EF (su un database nuovo di zecca). Quindi ho le classi modello che uso in EF.
EF Codefirst e RDLC Reports

Ora ho bisogno di creare alcuni rapporti RDLC. Per fare questo ho bisogno di creare un set di dati. Quindi, come posso creare un set di dati utilizzando le mie classi di modelli? Esistono relazioni tra classi di modelli che devo portare al set di dati.

Il mio obiettivo finale è progettare e inserire dati nel mio rapporto utilizzando i miei modelli di ef.

Grazie in adance

risposta

3

Generalmente EF non supporta set di dati. Se si desidera popolare DataSet con dati caricati con EF, è necessario fornire le proprie funzionalità per questo. Qui presento un esempio come popolare oggetto DataTable dal risultato ottenuto con la query:

public static class IEnumerableExtensions 
{ 
    public static DataTable ToDataTable<TEntity>(this IEnumerable<TEntity> entities) 
    { 
     DataTable table = new DataTable(); 
     IEnumerable<PropertyInfo> properties = typeof(TEntity) 
      .GetProperties() 
      .Where(p => !p.PropertyType.IsClass || p.PropertyType == typeof(string)) 
     foreach(string propertyName in properties.Select(p => p.Name)) 
     { 
      table.Columns.Add(propertyName); 
     } 
     foreach(object item in entities) 
     { 
      List<object> propertiesValues = new List<object>(); 
      foreach (PropertyInfo property in properties) 
      { 
       propertiesValues.Add(property.GetValue(item)); 
      } 
      table.Rows.Add(propertiesValues.ToArray()); 
     } 
     return table; 
    } 
} 

si potrebbe utilizzare questo metodo di estensione come segue:

DataTable table = context.People.ToDataTable(); 

Se si desidera implementare relazioni tra le tabelle poi il la logica che devi fare sarà più complicata. È necessario utilizzare la proprietà ChildRelations degli oggetti DataTable per collegarli con le relazioni. Quindi gli oggetti DataTable che potresti inserire in DataSet.