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