This commit is contained in:
2021-06-24 21:40:30 +00:00
parent 370c301030
commit 392faeeb28
2 changed files with 68 additions and 42 deletions

View File

@@ -363,10 +363,21 @@ namespace AyaNova.Biz
{
var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE);
idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray();
//query for this batch, comes back in db natural order unfortunately
var batchResults = await ct.Customer.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync();
//order the results back into original
//What is happening here:
//for performance the query is batching a bunch at once by fetching a block of items from the sql server
//however it's returning in db order which is often not the order the id list is in
//so it needs to be sorted back into the same order as the ide list
//This would not be necessary if just fetching each one at a time individually (like in workorder get report data)
var orderedList = from id in batch join z in batchResults on id equals z.Id select z;
foreach (Customer w in orderedList)
{
await PopulateVizFields(w);

View File

@@ -874,7 +874,6 @@ namespace AyaNova.Biz
{
//workorder reports for entire workorder or just sub parts all go through here
//if the ayatype is a descendant of the workorder then only the portion of the workorder from that descendant directly up to the header will be populated and returned
//however if the report template has includeWoItemDescendants=true then the woitems is fully populated
var idList = dataListSelectedRequest.SelectedRowIds;
@@ -888,49 +887,65 @@ namespace AyaNova.Biz
foreach (long batchId in batch)
batchResults.Add(await WorkOrderGetPartialAsync(dataListSelectedRequest.AType, batchId, dataListSelectedRequest.IncludeWoItemDescendants));
#region unnecessary shit removed
//This is unnecessary because the re-ordering bit is only needed when the records are fetched in batches directly from the sql server as they
//return in db natural order and need to be put back into the same order as the ID List
//Here in the workorder however, this code is fetching individually one at a time so they are always going to be in the correct order so this re-ordering is unnecessary
//I'm keeping this here for future reference when I ineveitably wonder what the hell is happening here :)
//order the results back into original
IEnumerable<WorkOrder> orderedList = null;
switch (dataListSelectedRequest.AType)
{
case AyaType.WorkOrder:
orderedList = from id in batch join z in batchResults on id equals z.Id select z;
break;
case AyaType.WorkOrderItem:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Id select z;
break;
case AyaType.WorkOrderItemExpense:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Expenses[0].Id select z;
break;
case AyaType.WorkOrderItemLabor:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Labors[0].Id select z;
break;
case AyaType.WorkOrderItemLoan:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Loans[0].Id select z;
break;
case AyaType.WorkOrderItemPart:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Parts[0].Id select z;
break;
case AyaType.WorkOrderItemPartRequest:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].PartRequests[0].Id select z;
break;
case AyaType.WorkOrderItemScheduledUser:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].ScheduledUsers[0].Id select z;
break;
case AyaType.WorkOrderItemTask:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Tasks[0].Id select z;
break;
case AyaType.WorkOrderItemTravel:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Travels[0].Id select z;
break;
case AyaType.WorkOrderItemOutsideService:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].OutsideServices[0].Id select z;
break;
case AyaType.WorkOrderItemUnit:
orderedList = from id in batch join z in batchResults on id equals z.Items[0].Units[0].Id select z;
break;
}
//IEnumerable<WorkOrder> orderedList = null;
foreach (WorkOrder w in orderedList)
//TODO: WHAT IS THIS BATCH RESULT ORDERING CODE REALLY DOING AND CAN IT BE REMOVED / CHANGED????
//isn't it alredy working in order? If not maybe simply reversed so reverse it again before querying above or...??
//todo: can't assume the grandchild item is index 0 anymore as we might have multiple of them if includedescendants is true
//so need to find index first then do this
// switch (dataListSelectedRequest.AType)
// {
// case AyaType.WorkOrder:
// orderedList = from id in batch join z in batchResults on id equals z.Id select z;
// break;
// case AyaType.WorkOrderItem:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Id select z;
// break;
// case AyaType.WorkOrderItemExpense:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Expenses[0].Id select z;
// break;
// case AyaType.WorkOrderItemLabor:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Labors[0].Id select z;
// break;
// case AyaType.WorkOrderItemLoan:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Loans[0].Id select z;
// break;
// case AyaType.WorkOrderItemPart:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Parts[0].Id select z;
// break;
// case AyaType.WorkOrderItemPartRequest:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].PartRequests[0].Id select z;
// break;
// case AyaType.WorkOrderItemScheduledUser:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].ScheduledUsers[0].Id select z;
// break;
// case AyaType.WorkOrderItemTask:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Tasks[0].Id select z;
// break;
// case AyaType.WorkOrderItemTravel:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Travels[0].Id select z;
// break;
// case AyaType.WorkOrderItemOutsideService:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].OutsideServices[0].Id select z;
// break;
// case AyaType.WorkOrderItemUnit:
// orderedList = from id in batch join z in batchResults on id equals z.Items[0].Units[0].Id select z;
// break;
// }
//foreach (WorkOrder w in orderedList)
#endregion unnecessary shit
foreach (WorkOrder w in batchResults)
{
var jo = JObject.FromObject(w);