[.net] Crystal Reports和LINQ



Answers

msdn文档建议您可以将Crystal Report绑定到ICollection。

我可以推荐一个List(T)?

Question

有没有人想出了如何将Crystal Reports与Linq to SQL一起使用?




上面的代码不会在Web应用程序中工作,如果你有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;



Links