Question

Quelqu'un at-il compris comment utiliser Crystal Reports avec Linq en SQL?

Était-ce utile?

La solution

Vous pouvez convertir votre jeu de résultats LINQ en une liste , vous n'êtes pas obligé d'utiliser strictement un ensemble de données en tant que rapports SetDataSource , vous pouvez fournir des données Crystal Reports avec un IEnumerable . Comme List hérite de IEnumerable , vous pouvez définir la source de données de vos rapports sur une liste. Il vous suffit d'appeler la méthode .ToList () sur votre jeu de résultats LINQ. Fondamentalement:

        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;

Autres conseils

Le le msdn doc est suggéré que vous pouvez lier un rapport Crystal à une collection IC.

Puis-je recommander une liste (T)?

Bien que je n’ai pas essayé moi-même, il semble possible de combiner DataContext.LoadOptions pour qu’il accepte les relations et GetCommand (IQueryable) pour renvoyer un objet SQLCommand préservant les relations.

Voir plus d'informations sur Forums MSDN .

Le code ci-dessus ne fonctionnera pas dans une application Web si vous avez des valeurs dbnull. Vous devez convertir l'objet de liste de résultats en dataset ou datatable. Il n'y a pas de méthode intégrée pour cela. Je suis passé par le même problème et après des heures d'exploration sur Internet, j'ai trouvé la solution et je veux partager ici pour aider tous ceux qui s'en tiennent à la. Vous devez faire un cours dans votre projet: -

 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;
        }
    }

et ici la configuration de votre rapport de cristal

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top