I am fetching ProductTransfer table together with related products. Although the total records = 1200, am only getting three records returned by my api.
Here is my models
public class ProductTransferDto
{
public int Id { get; set; }
public int BusinessId { get; set; }
public ProductTransferType ProductTransferType { get; set; }
public ProductTransferStatus ProductTransferStatus { get; set; }
public ProductTransferAprroved ProductTransferAprroved { get; set; }
public List<ProductTransferDetailDto> Products { get; set; } = [];
public string? RegisterBy { get; set; } = null;
public string? BranchName { get; set; } = null;
public int? BranchId { get; set; }
public DateTime TransferedOn { get; set; }
public decimal? StockValue { get; set; } = 0;
public int? ItemCount { get; set; } = 0;
public DateTime ApprovedOn { get; set; }
public string? ReceivedById { get; set; } = null;
public DateTime ReceivedOn { get; set; }
public string? Note { get; set; } = null;
}
public class ProductTransferDetailDto
{
public int Id { get; set; }
public int ProductTransferId { get; set; }
public int? ProductId { get; set; } = null;
public string? Name { get; set; } = null;
public string? Code { get; set; } = null;
public decimal SellingPrice { get; set; } = 0;
public decimal BuyingPrice { get; set; } = 0;
public decimal WholeSalePrice { get; set; } = 0;
public decimal Quantity { get; set; } = 0;
public string? ProfitMargin { get; set; } = null;
}
Here is my method for fetching data from my MySQL database with Dapper.
public async Task<PagedList<ProductTransferDto>> GetProductTransersByAdmin(SearchParameters searchParameters, int ProductTransferType)
{
try
{
using var connection = _dapperContext.CreateConnection();
var parameters = new DynamicParameters();
parameters.Add("@ProductTransferType", ProductTransferType);
parameters.Add("@StartDate", searchParameters.StartDate);
parameters.Add("@EndDate", searchParameters.EndDate);
parameters.Add("@BranchId", searchParameters.BranchId > 0 ? searchParameters.BranchId : null);
parameters.Add("@Skip", (searchParameters.PageNumber - 1) * searchParameters.PageSize);
parameters.Add("@Take", searchParameters.PageSize);
var SqlTotal = @"
SELECT COUNT(*)
FROM ProductTransfers PT
WHERE PT.ProductTransferType = @ProductTransferType
AND PT.TransferedOn BETWEEN @StartDate AND @EndDate
AND (@BranchId IS NULL OR PT.BranchId = @BranchId);
";
var SqlList = @"
SELECT
PT.Id,
PT.BusinessId,
PT.TransferedOn,
PT.ProductTransferType,
PT.ProductTransferStatus,
PT.ProductTransferAprroved,
PT.StockValue,
PT.ItemCount,
PT.ApprovedOn,
PT.ReceivedOn,
PT.Note,
B.Name AS BranchName,
B.Id AS BranchId,
R.Name AS RegisterBy,
PTP.Id,
PTP.ProductTransferId,
PTP.ProductId,
PTP.Name,
PTP.Code,
PTP.SellingPrice,
PTP.BuyingPrice,
PTP.WholesalePrice,
PTP.Quantity,
PTP.ProfitMargin
FROM producttransfers PT
LEFT JOIN branches B ON B.Id = PT.BranchId
LEFT JOIN registration R ON R.Id = PT.RegisterId
LEFT JOIN producttransferdetails PTP ON PTP.ProductTransferId = PT.Id
WHERE PT.ProductTransferType = @ProductTransferType
AND PT.TransferedOn BETWEEN @StartDate AND @EndDate
AND (@BranchId IS NULL OR PT.BranchId = @BranchId)
ORDER BY PT.Id DESC
LIMIT @Take OFFSET @Skip;
";
// 1) Read count
var total = await connection.ExecuteScalarAsync<int>(SqlTotal, parameters);
// 2) Read full result set with children (multi-mapping)
var lookup = new Dictionary<int, ProductTransferDto>();
var transfers = await connection.QueryAsync<ProductTransferDto, ProductTransferDetailDto, ProductTransferDto>(SqlList,
(pt, ptp) =>
{
if (!lookup.TryGetValue(pt.Id, out var entry))
{
entry = pt;
lookup.Add(entry.Id, entry);
}
entry.Products.Add(ptp);
return entry;
}, parameters,
splitOn: "Id"
);
var TransferList = transfers.Distinct().ToList();
Console.WriteLine("Total Transfers Count: " + total); // 1200
Console.WriteLine("Total Transfers: " + TransferList.Count); // only 3
return PagedList<ProductTransferDto>.ToPagedList(
TransferList,
total,
searchParameters.PageNumber,
searchParameters.PageSize
);
}
catch (MySqlException ex)
{
_logger.LogError(ex, "MySQL Database error occurred Fetching ProductTransfers");
throw new Exception("The database operation timed out.", ex);
}
catch (TimeoutException ex)
{
throw new Exception("The database operation timed out Fetching ProductTransfers.", ex);
}
catch (InvalidOperationException ex)
{
throw new Exception("Invalid database operation or data mapping error Fetching ProductTransfers.", ex);
}
}
What could I be missing?. I have looked on the dapper documentation but could not get a solution.