Вопрос

Кто-нибудь разобрался, как использовать Crystal Reports с Linq to SQL?

Это было полезно?

Решение

Вы можете преобразовать свой результирующий набор LINQ в List, вам не нужно строго использовать DataSet как сообщается в отчетах SetDataSource, вы можете предоставить данные Crystal Reports с помощью IEnumerable.С тех пор как List наследуется от IEnumerable вы можете задать источник данных ваших отчетов в виде списка, вам просто нужно вызвать .ToList() метод в вашем результирующем наборе LINQ.В основном:

        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;

Другие советы

Тот Самый msdn docпредположим, что вы можете привязать отчет Crystal к ICollection.

Могу ли я порекомендовать Список (T)?

Хотя я сам этого не пробовал, кажется, это возможно при использовании комбинации DataContext.LoadOptions, чтобы заставить его принимать отношения, и getCommand(IQueryable), чтобы возвращать объект SqlCommand, который сохраняет отношения.

Смотрите больше информации о Форумы MSDN.

Приведенный выше код не будет работать в веб-приложении, если у вас есть значения dbnull.Вы должны преобразовать объект списка результатов в dataset или datatable.Для этого нет встроенного метода.Я столкнулся с такой же проблемой, и после нескольких часов поиска в Интернете я нашел решение и хочу поделиться здесь, чтобы помочь всем, кто столкнулся с этим.Вы должны создать класс в своем проекте:-

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

и здесь настраиваем ваш 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top