Crystal Reports et LINQ
-
01-07-2019 - |
Question
Quelqu'un at-il compris comment utiliser Crystal Reports avec Linq en SQL?
La solution
Vous pouvez convertir votre jeu de résultats LINQ en une liste
, vous n'êtes pas obligé d'utiliser strictement un ensemble de données
en tant que rapports SetDataSource
, vous pouvez fournir des données Crystal Reports avec un IEnumerable
. Comme List
hérite de IEnumerable
, vous pouvez définir la source de données de vos rapports sur une liste. Il vous suffit d'appeler la méthode .ToList ()
sur votre jeu de résultats LINQ. Fondamentalement:
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;
Autres conseils
Le le msdn doc est suggéré que vous pouvez lier un rapport Crystal à une collection IC.
Puis-je recommander une liste (T)?
Bien que je n’ai pas essayé moi-même, il semble possible de combiner DataContext.LoadOptions pour qu’il accepte les relations et GetCommand (IQueryable) pour renvoyer un objet SQLCommand préservant les relations.
Voir plus d'informations sur Forums MSDN .
Le code ci-dessus ne fonctionnera pas dans une application Web si vous avez des valeurs dbnull. Vous devez convertir l'objet de liste de résultats en dataset ou datatable. Il n'y a pas de méthode intégrée pour cela. Je suis passé par le même problème et après des heures d'exploration sur Internet, j'ai trouvé la solution et je veux partager ici pour aider tous ceux qui s'en tiennent à la. Vous devez faire un cours dans votre projet: -
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;
}
}
et ici la configuration de votre rapport de cristal
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;