Paging in .net core api
public async Task<Tuple<List<GetCustomerResponse>, int>> GetCustomerWithPaginations(GetCustomerRequest oRequest)
{
int totalCount = 0;
int skipData = (oRequest.PageIndex - 1) * oRequest.PageSize;
List<GetCustomerResponse> customerResponse = new List<GetCustomerResponse>();
if (oRequest.FromBalance != null || oRequest.ToBalance != null || oRequest.FromFreeBet != null || oRequest.ToFreeBet != null)
{
// get balance
IQueryable<GetCustomerResponse> data_balance = umpContext.Deposits
.Join(umpContext.FreebetsDeposits, bal => bal.PlayerId, fb => fb.PlayerId
, (bal, fb) => new { PlayerId = bal.PlayerId.ToString(), Balance = bal.Amount, FreeBet = fb.Amount })
.Join(umpContext.JPWallet, bal => bal.PlayerId, jp => jp.PlayerId.ToString()
, (bal, jp) => new { PlayerId = bal.PlayerId, bal.Balance, bal.FreeBet, JPToken = jp.Token })
.Select(x => new GetCustomerResponse { PlayerId = x.PlayerId, Balance = x.Balance, FreeBet = x.FreeBet, JPToken = x.JPToken })
.Distinct().OrderByDescending(x => x.PlayerId).AsQueryable();
if (oRequest.FromBalance != null && oRequest.ToBalance != null)
{
data_balance = data_balance.Where(x => x.Balance >= oRequest.FromBalance && x.Balance <= oRequest.ToBalance);
}
if (oRequest.FromFreeBet != null && oRequest.ToFreeBet != null)
{
data_balance = data_balance.Where(x => x.FreeBet >= oRequest.FromFreeBet && x.FreeBet <= oRequest.ToFreeBet);
}
totalCount = await data_balance.CountAsync();
var data_balance_filter = await data_balance.Skip(skipData).Take(oRequest.PageSize).ToListAsync();
// get player details
var playerIds = data_balance_filter.Select(x => x.PlayerId).Distinct().ToList();
List<GetCustomerResponse> list = await bbcContext.BbCustomer.Where(x => playerIds.Contains(x.provider_identification))
.Join(bbcContext.BbCustomerLoginIdentification, x => x.bb_customer_id, y => y.BbCustomerId, (x, y) => new { x.bb_customer_id, x.provider_identification, y.IdentificationValue, y.BbLoginIdentificationId, x.is_deleted, x.created_date })
.Where(x => x.BbLoginIdentificationId == 2 && x.is_deleted == oRequest.IsDeleted)
.Select(x => new GetCustomerResponse
{
UserId = x.bb_customer_id,
PlayerId = x.provider_identification,
PlayerMobile = x.IdentificationValue,
RegisteredDate = x.created_date,
LatestLogin = (bbcContext.BbLoginHistory.Where(lh => lh.bb_customer_id == x.bb_customer_id).OrderByDescending(lh => lh.created_date).FirstOrDefault().created_date)
})
.OrderByDescending(x => x.PlayerId).ToListAsync();
var all_data = data_balance_filter.GroupJoin(list,
bal => bal.PlayerId,
detail => detail.PlayerId,
(b, d) => new { bal = b, detail = d.SingleOrDefault() });
customerResponse = all_data.Select(x => new GetCustomerResponse()
{
PlayerId = x.bal.PlayerId,
UserId = x.detail == null ? null : x.detail.UserId,
PlayerMobile = x.detail == null ? null : x.detail.PlayerMobile,
Balance = x.bal.Balance,
FreeBet = x.bal.FreeBet,
JPToken = x.bal.JPToken,
RegisteredDate = x.detail == null ? null : x.detail.RegisteredDate,
LatestLogin = x.detail == null ? null : x.detail.LatestLogin
}).OrderByDescending(x => x.PlayerId).ToList();
return Tuple.Create(customerResponse, totalCount);
}
else
{
// get player details
IQueryable<GetCustomerResponse> data = bbcContext.BbCustomer.Where(x => x.bb_site_id == oRequest.SiteId)
.Join(bbcContext.BbCustomerLoginIdentification, x => x.bb_customer_id, y => y.BbCustomerId, (x, y) => new { x.bb_customer_id, x.provider_identification, y.IdentificationValue, y.BbLoginIdentificationId, x.is_deleted, x.created_date })
.Where(x => x.BbLoginIdentificationId == 2 && x.is_deleted == oRequest.IsDeleted)
.Select(x => new GetCustomerResponse
{
UserId = x.bb_customer_id,
PlayerId = x.provider_identification,
PlayerMobile = x.IdentificationValue,
RegisteredDate = x.created_date,
LatestLogin = (bbcContext.BbLoginHistory.Where(lh => lh.bb_customer_id == x.bb_customer_id).OrderByDescending(lh => lh.created_date).FirstOrDefault().created_date)
})
.OrderByDescending(x => x.PlayerId)
.Distinct()
.AsQueryable();
if (!string.IsNullOrEmpty(oRequest.UserId))
{
data = data.Where(x => x.UserId.ToString() == oRequest.UserId);
}
else if (!string.IsNullOrEmpty(oRequest.PlayerId))
{
data = data.Where(x => x.PlayerId.ToString() == oRequest.PlayerId);
}
else if (!string.IsNullOrEmpty(oRequest.PlayerMobile))
{
data = data.Where(x => x.PlayerMobile == oRequest.PlayerMobile);
}
else if (oRequest.FromDateReg != null && oRequest.ToDateReg != null)
{
data = data.Where(x => x.RegisteredDate >= oRequest.FromDateReg && x.RegisteredDate <= oRequest.ToDateReg);
}
totalCount = await data.CountAsync();
data = data.Skip(skipData).Take(oRequest.PageSize);
List<GetCustomerResponse> list = await data.ToListAsync();
// get balance
var playerIds = list.Select(x => x.PlayerId).Distinct().ToList();
IQueryable<GetCustomerResponse> data_balance = umpContext.Deposits.Where(x => playerIds.Contains(x.PlayerId.ToString()))
.Join(umpContext.FreebetsDeposits, bal => bal.PlayerId, fb => fb.PlayerId
, (bal, fb) => new { PlayerId = bal.PlayerId.ToString(), Balance = bal.Amount, FreeBet = fb.Amount })
.Join(umpContext.JPWallet, bal => bal.PlayerId, jp => jp.PlayerId.ToString()
, (bal, jp) => new { bal.PlayerId, bal.Balance, bal.FreeBet, jp.Token })
.Select(x => new GetCustomerResponse()
{
PlayerId = x.PlayerId,
Balance = x.Balance,
FreeBet = x.FreeBet,
JPToken = x.Token
})
.AsQueryable();
var all_data = list.GroupJoin(
data_balance,
detail => detail.PlayerId,
bal => bal.PlayerId,
(d, b) => new { detail = d, bal = b.SingleOrDefault() });
customerResponse = all_data.Select(x => new GetCustomerResponse()
{
PlayerId = x.detail.PlayerId,
UserId = x.detail.UserId,
PlayerMobile = x.detail.PlayerMobile,
Balance = x.bal == null ? null : x.bal.Balance,
FreeBet = x.bal == null ? null : x.bal.FreeBet,
JPToken = x.bal == null ? 0 : x.bal.JPToken,
RegisteredDate = x.detail.RegisteredDate,
LatestLogin = x.detail.LatestLogin
}).OrderByDescending(x => x.PlayerId).ToList();
return Tuple.Create(customerResponse, totalCount);
}
}
-----------------------
public class GetCustomerResponse
{
[Key]
public string PlayerId { get; set; }
public string PlayerMobile { get; set; }
public long? UserId { get; set; }
public decimal? Balance { get; set; }
public decimal? FreeBet { get; set; }
public int? JPToken { get; set; }
public DateTime? RegisteredDate { get; set; }
public DateTime? LatestLogin { get; set; }
}
-----------------------
public class PaginationInfo
{
private const int MaxPageSize = 9999;
private int _pageSize = 5;
public int PageSize
{
get => _pageSize;
set => _pageSize = (value > MaxPageSize) ? MaxPageSize : value;
}
public int PageIndex { get; set; }
public PaginationInfo()
{
this.PageIndex = 1;
this.PageSize = 5;
}
}
public class GetCustomerRequest : PaginationInfo
{
public int SiteId { get; set; }
public decimal? FromBalance { get; set; }
public decimal? ToBalance { get; set; }
public decimal? FromFreeBet { get; set; }
public decimal? ToFreeBet { get; set; }
public decimal? FromJPToken { get; set; }
public decimal? ToJPToken { get; set; }
public string UserId { get; set; }
public string PlayerId { get; set; }
public string PlayerMobile { get; set; }
public bool IsDeleted { get; set; } = false;
public DateTime? FromDateReg { get; set; }
public DateTime? ToDateReg { get; set; }
public GetCustomerRequest() : base()
{ }
}
Comments
Post a Comment