SelectAppService performans güçlendir

This commit is contained in:
Sedat Öztürk 2026-02-04 22:20:45 +03:00
parent 2aa5e99da2
commit 948ab358e4
2 changed files with 69 additions and 62 deletions

View file

@ -7,6 +7,7 @@ using Erp.Platform.OrganizationUnits;
using Erp.Platform.Queries; using Erp.Platform.Queries;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Uow;
using static Erp.Platform.PlatformConsts; using static Erp.Platform.PlatformConsts;
namespace Erp.Platform.ListForms.Administration; namespace Erp.Platform.ListForms.Administration;
@ -50,6 +51,7 @@ public class ListFormQueryPreviewAppService : PlatformAppService
this.dynamicDataManager = dynamicDataManager; this.dynamicDataManager = dynamicDataManager;
} }
[UnitOfWork]
public async Task<string> GetListFormSelectQueryAsync(string listFormCode) public async Task<string> GetListFormSelectQueryAsync(string listFormCode)
{ {
//Izin logic process //Izin logic process
@ -62,18 +64,21 @@ public class ListFormQueryPreviewAppService : PlatformAppService
//kullaniciya ait ListFormField verilerini al //kullaniciya ait ListFormField verilerini al
var fields = await listFormFieldManager.GetUserListFormFields(listFormCode); var fields = await listFormFieldManager.GetUserListFormFields(listFormCode);
fields = fields.Where(a => a.CanRead).ToList();
// Performans: Filtrelemeyi Where ile yap, tek seferde ToList() çağır
var readableFields = fields.Where(a => a.CanRead).ToList();
//kullaniciya ait Server Customization verilerini al //kullaniciya ait Server Customization verilerini al
var customizations = await listFormCustomizationManager.GetUsersServerCustomizations(listFormCode); var customizations = await listFormCustomizationManager.GetUsersServerCustomizations(listFormCode);
var (_, _, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode); var (_, _, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
selectQueryManager.PrepareQueries(listForm, fields, dataSourceType, customizations); selectQueryManager.PrepareQueries(listForm, readableFields, dataSourceType, customizations);
return selectQueryManager.SelectQuery; return selectQueryManager.SelectQuery;
} }
[UnitOfWork]
public async Task<string> GetListFormDataQueryAsync(string listFormCode, OperationEnum op) public async Task<string> GetListFormDataQueryAsync(string listFormCode, OperationEnum op)
{ {
var authType = op switch var authType = op switch

View file

@ -162,18 +162,17 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
if (!string.IsNullOrEmpty(queryParams.Group) && !string.IsNullOrEmpty(selectQueryManager.GroupQuery)) if (!string.IsNullOrEmpty(queryParams.Group) && !string.IsNullOrEmpty(selectQueryManager.GroupQuery))
{ {
//Console.WriteLine("===");
//Console.WriteLine(selectQueryManager.GroupQuery);
var data = await dynamicDataRepository.QueryAsync(selectQueryManager.GroupQuery, connectionString, param); var data = await dynamicDataRepository.QueryAsync(selectQueryManager.GroupQuery, connectionString, param);
List<(string, int, List<dynamic>)> groups = []; var dataQueryable = data.AsQueryable();
var groups = new List<(string, int, List<dynamic>)>(selectQueryManager.GroupTuples.Count);
for (int i = 0; i < selectQueryManager.GroupTuples.Count; i++) for (int i = 0; i < selectQueryManager.GroupTuples.Count; i++)
{ {
var groupTuple = selectQueryManager.GroupTuples[i]; var groupTuple = selectQueryManager.GroupTuples[i];
// var selectExpr = string.Join(",", selectQueryManager.GroupTuples.Take(i + 1).Select(a => $"{a.SelectExpr} as {a.SelectExpr}")); var group = dataQueryable.GroupBy($"{groupTuple.SelectExpr}_Key").ToDynamicList();
var group = data.AsQueryable().GroupBy($"{groupTuple.SelectExpr}_Key").ToDynamicList();
groups.Add((groupTuple.SelectExpr, groupTuple.Index, group)); groups.Add((groupTuple.SelectExpr, groupTuple.Index, group));
} }
var items = SetGroupItems(groups, groups.First().Item3, 0); var items = SetGroupItems(groups, groups[0].Item3, 0);
result.GroupCount = input.RequireGroupCount ? items.Count : -1; result.GroupCount = input.RequireGroupCount ? items.Count : -1;
result.Data = items; result.Data = items;
@ -231,13 +230,16 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
if (!listForm.WidgetsJson.IsNullOrWhiteSpace()) if (!listForm.WidgetsJson.IsNullOrWhiteSpace())
{ {
var widgetList = JsonSerializer.Deserialize<WidgetEditDto[]>(listForm.WidgetsJson) ?? []; var widgetList = JsonSerializer.Deserialize<WidgetEditDto[]>(listForm.WidgetsJson) ?? [];
foreach (var widget in widgetList.Where(w => w.IsActive)) var activeWidgets = widgetList.Where(w => w.IsActive && !string.IsNullOrWhiteSpace(w.SqlQuery)).ToList();
{
if (!string.IsNullOrWhiteSpace(widget.SqlQuery))
{
if (activeWidgets.Count == 0)
return Widgets;
// DataSource connection'ı bir kez al (performans)
var (dynamicDataRepository, connectionString, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode); var (dynamicDataRepository, connectionString, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
foreach (var widget in activeWidgets)
{
var w = new WidgetDto var w = new WidgetDto
{ {
ColGap = widget.ColGap, ColGap = widget.ColGap,
@ -264,13 +266,11 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
}); });
} }
} }
} }
Widgets.Add(w); Widgets.Add(w);
} }
} }
}
return Widgets; return Widgets;
} }
@ -308,31 +308,34 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
var queryParameters = httpContextAccessor.HttpContext.Request.Query.ToDictionary(x => x.Key, x => x.Value); var queryParameters = httpContextAccessor.HttpContext.Request.Query.ToDictionary(x => x.Key, x => x.Value);
var defaultFields = await defaultValueManager.GenerateDefaultValuesAsync(listForm, Enums.OperationEnum.Select, queryParameters: queryParameters); var defaultFields = await defaultValueManager.GenerateDefaultValuesAsync(listForm, Enums.OperationEnum.Select, queryParameters: queryParameters);
// Performans: Dictionary ile hızlı lookup
var columnFormatsDict = result.ColumnFormats.ToDictionary(c => c.FieldName, c => c);
foreach (var field in defaultFields) foreach (var field in defaultFields)
{ {
if (result.ColumnFormats.Any(a => a.FieldName == field.Key)) if (columnFormatsDict.TryGetValue(field.Key, out var columnFormat))
{ {
result.ColumnFormats.FirstOrDefault(a => a.FieldName == field.Key).DefaultValue = field.Value; columnFormat.DefaultValue = field.Value;
} }
} }
if (!listForm.ExtraFilterJson.IsNullOrWhiteSpace()) if (!listForm.ExtraFilterJson.IsNullOrWhiteSpace())
{ {
var extraFilterList = JsonSerializer.Deserialize<ExtraFilterEditDto[]>(listForm.ExtraFilterJson) ?? []; var extraFilterList = JsonSerializer.Deserialize<ExtraFilterEditDto[]>(listForm.ExtraFilterJson) ?? [];
foreach (var extraFilter in extraFilterList) var activeFilters = extraFilterList.Where(f => !string.IsNullOrWhiteSpace(f.SqlQuery)).ToList();
{
if (!string.IsNullOrWhiteSpace(extraFilter.SqlQuery)) if (activeFilters.Count > 0)
{ {
// DataSource connection'ı bir kez al (performans)
var (dynamicDataRepository, connectionString, dataSourceType) = var (dynamicDataRepository, connectionString, dataSourceType) =
await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode); await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
var items = await dynamicDataRepository.QueryAsync(extraFilter.SqlQuery, connectionString); // Dictionary ile hızlı lookup
if (items != null) var filtersDict = result.GridOptions.ExtraFilterDto.ToDictionary(f => f.FieldName, f => f);
{
var filters = result.GridOptions.ExtraFilterDto.ToList();
var filter = filters.FirstOrDefault(a => a.FieldName == extraFilter.FieldName);
if (filter != null) foreach (var extraFilter in activeFilters)
{
var items = await dynamicDataRepository.QueryAsync(extraFilter.SqlQuery, connectionString);
if (items != null && filtersDict.TryGetValue(extraFilter.FieldName, out var filter))
{ {
var newItems = new List<ExtraFilterItemsDto>(); var newItems = new List<ExtraFilterItemsDto>();
@ -350,11 +353,10 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
filter.Items = newItems; filter.Items = newItems;
} }
}
// 🔑 yeniden atıyoruz ki setter çalışsın // 🔑 yeniden atıyoruz ki setter çalışsın
result.GridOptions.ExtraFilterDto = filters.ToArray(); result.GridOptions.ExtraFilterDto = filtersDict.Values.ToArray();
}
}
} }
} }