Castle ActiveRecord,C# - 通过减少执行的查询来提高ActiveRecordMediator.FindAll方法的性能

时间:2017-09-05 11:52:28

标签: c# mysql asp.net activerecord castle-activerecord

目前,我正在维护一个使用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;不是。这导致每次“备注”时都会调用数据库。字段被检索。我的第一个预感是热切地加载备注数据。我不确定如何实现这一目标。当我知道更多时会更新。

0 个答案:

没有答案