在填充 ADO.NET 对象之前筛选记录集
Filter Record Set Before Populating ADO.NET Object
我使用 this tutorial 在我的应用程序中构建了一个 Crystal 报告。本教程指导用户开发 ADO.NET 对象,然后用数据填充它。我还在 Crystal 报告中使用一个参数来限制数据集。我遇到的问题是加载报告很慢,我想知道这是否是因为在 Crystal 报告使用参数过滤器之前我必须加载比实际需要更多的数据。
以下是我现有的代码,它在报表查看器表单加载事件上运行。我想调整下面的代码以传递一个参数,这样我就可以在数据加载时对其进行过滤,而不是加载一堆我知道我不需要或不会使用的数据。
private void InspectionReportSerial2_Viewer_Load(object sender, EventArgs e)
{
International_PZD_PRDEntities db = new International_PZD_PRDEntities();
var list = db.vw_Nightly_and_Inspections.Select(p=>new {ID = p.ID,
SerialNumber = p.SerialNumber, ProductionOrder = p.ProductionOrder,
Product=p.Product, Customer=p.Customer, SalesOrder = p.SalesOrder,
LineItem = p.LineItem, Section=p.Section,InspectionPoint=p.InspectionPoint,
Status=p.Status,SectionSignoffBy = p.SectionSignoffBy,
SectionSignoffCheck=p.SectionSignoffCheck,
SectionSignoffDate = p.SectionSignoffDate,HardwareSerial=p.HardwareSerial,
SectionSortString = p.SectionSortString, ItemSortString = p.ItemSortString,
Comment = p.Comment});
InspectionReportSerial21.SetDataSource(list);
}
加一个Where
。由于你没有描述你需要的那种过滤,我只能举个例子:
private void InspectionReportSerial2_Viewer_Load(object sender, EventArgs e)
{
International_PZD_PRDEntities db = new International_PZD_PRDEntities();
var list = db.vw_Nightly_and_Inspections
.Where(p => p.Customer == "Dekxblock")
.Select(p => new { ID = p.ID, SerialNumber = p.SerialNumber, ... });
InspectionReportSerial21.SetDataSource(list);
}
我不知道 International_PZD_PRDEntities
是什么。如果它是某种 O/R-mapper(例如 EF 或 EF Core),那么这将在数据库端过滤记录,这比在您的应用程序中过滤数据更快,因为需要传输的记录更少。如果没有,那么您应该执行 SELECT * FROM vw_Nightly_and_Inspections WHERE Customer = 'Dekxblock'
之类的查询,包括过滤器。确保使用 Command.Parameters
我使用 this tutorial 在我的应用程序中构建了一个 Crystal 报告。本教程指导用户开发 ADO.NET 对象,然后用数据填充它。我还在 Crystal 报告中使用一个参数来限制数据集。我遇到的问题是加载报告很慢,我想知道这是否是因为在 Crystal 报告使用参数过滤器之前我必须加载比实际需要更多的数据。
以下是我现有的代码,它在报表查看器表单加载事件上运行。我想调整下面的代码以传递一个参数,这样我就可以在数据加载时对其进行过滤,而不是加载一堆我知道我不需要或不会使用的数据。
private void InspectionReportSerial2_Viewer_Load(object sender, EventArgs e)
{
International_PZD_PRDEntities db = new International_PZD_PRDEntities();
var list = db.vw_Nightly_and_Inspections.Select(p=>new {ID = p.ID,
SerialNumber = p.SerialNumber, ProductionOrder = p.ProductionOrder,
Product=p.Product, Customer=p.Customer, SalesOrder = p.SalesOrder,
LineItem = p.LineItem, Section=p.Section,InspectionPoint=p.InspectionPoint,
Status=p.Status,SectionSignoffBy = p.SectionSignoffBy,
SectionSignoffCheck=p.SectionSignoffCheck,
SectionSignoffDate = p.SectionSignoffDate,HardwareSerial=p.HardwareSerial,
SectionSortString = p.SectionSortString, ItemSortString = p.ItemSortString,
Comment = p.Comment});
InspectionReportSerial21.SetDataSource(list);
}
加一个Where
。由于你没有描述你需要的那种过滤,我只能举个例子:
private void InspectionReportSerial2_Viewer_Load(object sender, EventArgs e)
{
International_PZD_PRDEntities db = new International_PZD_PRDEntities();
var list = db.vw_Nightly_and_Inspections
.Where(p => p.Customer == "Dekxblock")
.Select(p => new { ID = p.ID, SerialNumber = p.SerialNumber, ... });
InspectionReportSerial21.SetDataSource(list);
}
我不知道 International_PZD_PRDEntities
是什么。如果它是某种 O/R-mapper(例如 EF 或 EF Core),那么这将在数据库端过滤记录,这比在您的应用程序中过滤数据更快,因为需要传输的记录更少。如果没有,那么您应该执行 SELECT * FROM vw_Nightly_and_Inspections WHERE Customer = 'Dekxblock'
之类的查询,包括过滤器。确保使用 Command.Parameters