目前,我正在维护一个使用Castle ActiveRecord从数据库中检索数据的旧C#应用程序。当请求某个页面时,我们的客户抱怨了应用程序的性能。相关页面显示包含大量发票的表格。这是通过ActiveRecordMediator.FindAll方法完成的,该方法获取所请求类型的参数和ICriterion表达式的参数。一旦gridview充满了发票数组,就会执行大量的查询。我怀疑这会导致糟糕的表现。理想情况下,我想限制执行的查询数量。不幸的是,到目前为止我的尝试还没有成功,因为我一般不熟悉Castle ActiveRecord和ORM。
我认为这个问题与延迟加载有关,并且可能选择N + 1'问题。我试过调整FetchMode无济于事。到目前为止,Google搜索了如何解决与“ActiveRecordMediator”相关的问题。没有导致任何适用的策略。所以我希望有人能指出我如何提高“ActiveRecordMediator.FindAll”的性能。方法
下面您将找到导致大量查询的代码的精简版本。
在页面加载时调用的方法:
var invoices = new List<Invoice>(
Invoice.GetAll(Expression.Eq("BetaalSpecificatieVerstuurd", false)))
invoices.Sort(
new Comparison<Invoice>(
delegate (Factuur f1, Factuur f2)
{
return -1 * f1.ID.CompareTo(f2.ID);
}));
// After this point all the queries are executed.
gridviewList.DataSource = invoices;
gridviewList.DataBind();
GetAll方法:
public static T[] GetAll(ICriterion criterion)
{
if (criterion == null)
throw new ArgumentNullException("criteria");
return Source.FindAll(typeof(T), criterion) as T[];
}
FindAll方法实施:
public Array FindAll(Type t, ICriterion criterion)
{
ICriterion additionalCriterion = Expression.Eq("CompanyID", CurrentCompanyId);
ICriterion criterionToApply = Expression.And(criterion, additionalCriterion);
return ActiveRecordMediator.FindAll(t, criterionToApply);
}
多次执行的查询:
SELECT
this_.ID as ID0_0_,
this_.var1 as var12_0_0_,
this_.var2 as var23_0_0_,
this_.var3 as var34_0_0_,
this_.var4 as var45_0_0_,
...
FROM
Opmerking this_
WHERE
((this_.RelevantId = @p0 and this_.Type = @p1) and
this_.CompanyID = @p2)
ORDER BY
this_.IsImportant desc,
this_.Processed asc,
this_.Date desc
修改
在@mjwills的帮助下,我能够找出问题所在。在.ascx网页中,类Invoice的不同属性显示在gridview中。其中大多数已经加载,因为它们包含在数据库表发票中。然而,一个字段&#39;备注&#39;不是。这导致每次“备注”时都会调用数据库。字段被检索。我的第一个预感是热切地加载备注数据。我不确定如何实现这一目标。当我知道更多时会更新。