Frage

Hat jemand herausgefunden, wie Crystal Reports mit Linq verwenden, um SQL?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top