Кто-нибудь понял, как использовать Crystal Reports с Linq to SQL?
Crystal Reports и LINQ
Ответ 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;