I did sorting and filtering on the client. But as I understand it is not correct. I have a method to get data from a service.
Task<Result<IEnumerable<T>>> GetAsync(CancellationToken cancellationToken,
Expression<Func<T, bool>>? filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>>? sort = null,
string? include = null);
How do I write a query if I have 5 criteria for filtering (First Name, Last Name...)
I'm new to C#, so this might be a dumb question. Now I have sorting and filtering like this :( used in the project EF and PgSql
public async Task<IOrderedEnumerable<BlackList>> Handle(GetBlackListRequest request, CancellationToken cancellationToken)
{
IOrderedEnumerable<BlackList> x = null;
var result = await _readonlyRepository.GetAsync(cancellationToken);
var dataForSort = result.Value.Select(x => new BlackList
{
ItemId = x.Id,
LastName = x.LastName,
FirstName = x.FirstName,
MiddleName = x.MiddleName,
PhoneNumber = x.PhoneNumber,
CreateDate = x.CreateDate,
//Status = x.Status
}).ToList();
string? lastName = request.LastNameS,
firstName = request.FirstNameS,
middleName = request.MiddleNameS,
phone = request.PhoneNameS;
DateTime? date = null;
bool filterByLastName = true,
filterByFirstName = false,
filterByMiddleName = false,
filterByPhone = false,
filterByDate = true;
Func<BlackList, bool> predicateByLastName = x => x.LastName == lastName;
Func<BlackList, bool> predicateByFirstName = x => x.FirstName == firstName;
Func<BlackList, bool> predicateByMiddleName = x => x.MiddleName == middleName;
Func<BlackList, bool> predicateByPhone = x => x.PhoneNumber == phone;
Func<BlackList, bool> predicateByDate = x => x.CreateDate == date;
Func<BlackList, bool> mainPredicate = x => (!filterByLastName || predicateByLastName(x))
&& (!filterByFirstName || predicateByFirstName(x))
&& (!filterByMiddleName || predicateByMiddleName(x))
&& (!filterByPhone || predicateByPhone(x))
&& (!filterByDate || predicateByDate(x));
foreach (var entity in dataForSort.Where(mainPredicate))
{
Console.WriteLine(entity);
}
switch (request.SortBy)
{
case "LastName":
x = dataForSort.OrderBy(x => x.LastName);
break;
case "LastNameDecs": .....
select Id, LastName,[...] from (select * from person) dataForSort where dataForSort.Lastname = 'xxx' and [...]