Crystal Reports и LINQ - PullRequest
       19

Crystal Reports и LINQ

12 голосов
/ 19 сентября 2008

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

Ответы [ 4 ]

4 голосов
/ 07 октября 2011

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

Документ msdn предполагает, что вы можете связать отчет Crystal с ICollection.

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

1 голос
/ 19 сентября 2008

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

Подробнее на форумах MSDN .

0 голосов
/ 27 мая 2014

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

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