Crystal Reports und LINQ
-
01-07-2019 - |
Frage
Hat jemand herausgefunden, wie Crystal Reports mit Linq verwenden, um SQL?
Lösung
Sie können Ihre LINQ Ergebnis auf einen List
konvertieren, müssen Sie eine DataSet
nicht unbedingt verwenden, da die Berichte SetDataSource
, können Sie ein Crystal Reports-Daten mit einem IEnumerable
liefern. Da List
von IEnumerable
erbt können Sie Ihre Berichte Datenquelle auf eine Liste gesetzt, die Sie gerade die .ToList()
Methode auf LINQ Ergebnismenge nennen müssen. Grundsätzlich gilt:
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;
Andere Tipps
Die Msdn doc 's vorschlagen dass Sie einen Crystal Report in eine ICollection binden kann.
Darf ich empfehlen eine List (T)?
Altough ich es selbst nicht versucht haben, scheint es möglich zu sein, durch eine Kombination von DataContext.LoadOptions mit ihm eifrig zu machen Beziehungen zu akzeptieren und GetCommand (IQueryable) ein SqlCommand-Objekt zurückzugeben, die Beziehungen bewahrt.
Weitere Informationen finden Sie auf MSDN Foren .
Der obige Code wird nicht in Web-Anwendung arbeiten, wenn Sie DBNull Werte haben. Sie haben die Ergebnisliste Objekt-Datensatz oder Datentabelle zu konvertieren. Es gibt keine Methode zum gebaut. Ich habe durch das gleiche Problem gegangen und nach Stunden im Internet zu erforschen, fand ich die Lösung und wollen teilt hier jemand mit ihm stecken zu helfen. Sie müssen eine Klasse in Ihrem Projekt 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 Einrichten Ihres Crystal Reports
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;