Подтвердить что ты не робот

Crystal Reports и LINQ

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

4b9b3361

Ответ 1

Вы можете преобразовать свой набор результатов 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;

Ответ 2

msdn doc позволяют предположить, что вы можете связать Crystal Report с ICollection.

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

Ответ 3

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

Подробнее о Форумы MSDN.

Ответ 4

Вышеприведенный код не будет работать в веб-приложении, если у вас есть значения dbnull. Вы должны преобразовать объект списка результатов в набор данных или 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;
        }
    }

и здесь настройка отчета о кристалле

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;