Crystal Reports и LINQ
-
01-07-2019 - |
Вопрос
Кто-нибудь разобрался, как использовать 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;