2008-09-18 10 views

Antwort

4

Sie können Ihre LINQ Ergebnis auf einen List Sie eine DataSet wie die SetDataSource Berichte verwenden, müssen nicht unbedingt konvertieren, können Sie ein Crystal Reports-Daten mit einem IEnumerable liefern können. Da List von IEnumerable erbt, können Sie die Datenquelle Ihrer Berichte auf eine Liste setzen, Sie müssen nur die Methode .ToList() auf Ihrer LINQ-Ergebnismenge aufrufen. Grundsätzlich:

 CrystalReport1 cr1 = new CrystalReport1(); 

     var results = (from obj in context.tSamples 
         where obj.ID == 112 
         select new { obj.Name, obj.Model, obj.Producer }).ToList(); 

     cr1.SetDataSource(results); 
     crystalReportsViewer1.ReportSource = cr1; 
1

Obwohl ich es selbst nicht versucht habe, scheint es möglich zu sein, eine Kombination von DataContext.LoadOptions zu verwenden, um Beziehungen zu akzeptieren, und GetCommand (IQueryable), um ein SQLCommand-Objekt zurückzugeben, das Beziehungen beibehält.

Weitere Informationen unter MSDN Forums.

2

Die msdn doc schlägt vor, dass Sie einen Crystal Report an eine ICollection binden können.

Kann ich eine Liste (T) empfehlen?

0

Der obige Code funktioniert nicht in Web-Anwendung, wenn Sie dbnull Werte haben. Sie müssen das Ergebnislistenobjekt in ein Dataset oder eine Datentabelle konvertieren. Es gibt keine eingebaute Methode dafür. Ich habe das gleiche Problem durchgespielt und nach stundenlangem Erkunden im Internet fand ich die Lösung und möchte hier etwas teilen, um jedem zu helfen, der damit auftrumpft. Sie haben eine Klasse im Projekt zu machen: -

public class CollectionHelper 
    { 
     public CollectionHelper() 
     { 
     } 

     // this is the method I have been using 
     public DataTable ConvertTo<T>(IList<T> list) 
     { 
      DataTable table = CreateTable<T>(); 
      Type entityType = typeof(T); 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType); 

      foreach (T item in list) 
      { 
       DataRow row = table.NewRow(); 

       foreach (PropertyDescriptor prop in properties) 
       { 
        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
       } 

       table.Rows.Add(row); 
      } 

      return table; 
     } 

     public static DataTable CreateTable<T>() 
     { 
      Type entityType = typeof(T); 
      DataTable table = new DataTable(entityType.Name); 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType); 

      foreach (PropertyDescriptor prop in properties) 
      { 
       // HERE IS WHERE THE ERROR IS THROWN FOR NULLABLE TYPES 
       table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(
      prop.PropertyType) ?? prop.PropertyType); 
      } 

      return table; 
     } 
    } 

und hier die Einrichtung Ihres Crystal Report

CrystalReport1 cr1 = new CrystalReport1(); 

      var results = (from obj in context.tSamples 
          where obj.ID == 112 
          select new { obj.Name, obj.Model, obj.Producer }).ToList(); 
      CollectionHelper ch = new CollectionHelper(); 
      DataTable dt = ch.ConvertTo(results); 
      cr1.SetDataSource(dt); 
      crystalReportsViewer1.ReportSource = cr1;