Hat jemand herausgefunden, wie man Crystal Reports mit Linq zu SQL verwendet?Crystal Reports und LINQ
Antwort
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;
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.
Die msdn doc schlägt vor, dass Sie einen Crystal Report an eine ICollection binden können.
Kann ich eine Liste (T) empfehlen?
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;