Вопрос носит теоретический характер, и я хочу понять общие различия и особенности производительности, в частности, между двумя различными определениями, которые дают одинаковый результат. У меня есть класс GLProcessingModel
, который имеет ссылку на график (поэтому он не имеет прямых ссылок на пользовательский интерфейс). В классе есть метод, который определяет, что элемент имеет какое-то значение (в настоящее время мой код выглядит так):
private bool IsEmployerSuperWorkCover(MPCurrentPayPayItem payItem)
{
return PXSelectJoin<MPPayItem,
InnerJoin<MPPayItemType, On<MPPayItemType.payItemTypeID, Equal<MPPayItem.payItemTypeID>>,
InnerJoin<MPRollupItem, On<MPRollupItem.payItemID, Equal<MPPayItem.payItemID>>,
InnerJoin<MPRollup, On<MPRollup.rollupID, Equal<MPRollupItem.rollupID>>>>>,
Where<MPRollup.name, Equal<Required<MPRollup.name>>,
And<MPRollupItem.payItemID, Equal<Required<MPRollupItem.payItemID>>,
And<MPPayItemType.payItemTypeCD, Equal<Required<MPPayItemType.payItemTypeCD>>>>>>
.Select(Graph, MPPayItem.WORCOVER_AU, payItem.PayItemID, MPPayItemType.EMPLOYER_SUPER)
.AsEnumerable()
.Any();
}
Какая разница, если я определяю одно и то же выражение по-другому (или что-то в этом роде) ):
PXSelectJoin<MPPayItem, InnerJoin<MPPayItemType, On<MPPayItemType.payItemTypeID, Equal<MPPayItem.payItemTypeID>>,
InnerJoin<MPRollupItem, On<MPRollupItem.payItemID, Equal<MPPayItem.payItemID>>,
InnerJoin<MPRollup, On<MPRollup.rollupID, Equal<MPRollupItem.rollupID>>>>>,
Where<MPRollup.name, Equal<Required<MPRollup.name>>,
And<MPRollupItem.payItemID, Equal<Required<MPRollupItem.payItemID>>,
And<MPPayItemType.payItemTypeCD, Equal<Required<MPPayItemType.payItemTypeCD>>>>>> EmployerSuperWorkCoverQuery;
private bool IsEmployerSuperWorkCover(MPCurrentPayPayItem payItem)
{
if (EmployerSuperWorkCoverQuery == null)
{
EmployerSuperWorkCoverQuery = new PXSelectJoin<MPPayItem, InnerJoin<MPPayItemType, On<MPPayItemType.payItemTypeID, Equal<MPPayItem.payItemTypeID>>,
InnerJoin<MPRollupItem, On<MPRollupItem.payItemID, Equal<MPPayItem.payItemID>>,
InnerJoin<MPRollup, On<MPRollup.rollupID, Equal<MPRollupItem.rollupID>>>>>,
Where<MPRollup.name, Equal<Required<MPRollup.name>>,
And<MPRollupItem.payItemID, Equal<Required<MPRollupItem.payItemID>>,
And<MPPayItemType.payItemTypeCD, Equal<Required<MPPayItemType.payItemTypeCD>>>>>>(Graph);
}
return EmployerSuperWorkCoverQuery.Select(MPPayItem.WORCOVER_AU, payItem.PayItemID, MPPayItemType.EMPLOYER_SUPER)
.AsEnumerable()
.Any();
}
Я считаю, что каждый раз, когда graph вызывает метод в классе GLProcessingModel
, EmployerSuperWorkCoverQuery
будет иметь значение null и должен его инициализировать.
Я считаю, что есть лучший вариант для определения того же поведения. return PXSelectJoin<MPPayItem, ...
выглядит как соединение с БД, sql генерация и т.д. c и не лучший вариант.
Как это меняет механизм кэширования? Каков оптимальный способ реализовать такое поведение с наилучшей производительностью?