Что я делаю до сих пор, так это:
Объекты:
public class BaseEntity
{
public int Id { get; set; }
public DateTime CreateOn { get; set; }
}
public class Request : BaseEntity, IAggregateRoot
{
public Approval Approval { get; set; }
}
public class Approval // Value object
{
public bool? IsApproved { get; set; }
}
Репо:
public async Task<IReadOnlyList<Request>> GetAllAsync()
{
IQueryable<Request> requests = await _dbContext.Requests.ToListAsync();
IQueryable<Request> pending = requests.Where(r => r.Approval.IsApproved == null).OrderBy(r => r.CreateOn);
IQueryable<Request> processed = requests.Where(r => r.Approval.IsApproved != null).OrderByDescending(r => r.CreateOn);
return pending.Concat(processed).ToListAsync();
}
Проблема, с которой я сталкиваюсь, заключается в том, что я выполняю итерациюрезультат GetAllAsync
и IsApproved
имеет значение, Approval
установлено на null
.Если я верну только requests
без конкатенации, он будет работать должным образом (объект создан, но значения внутри него null
).
Я подозреваю, что проблема связана с конкатенацией двух запросов.Как я могу переписать то, что у меня есть в одном запросе?
Запросы должны быть сгруппированы по обработанным и не обработанным (IsApproved == null
и IsApproved != null
), а затем упорядочены по CreatedOn
в разных порядках.
Также был бы очень признателен, если бы кто-нибудь мог объяснить мне, почему после объединения Approval
устанавливается в null
, если IsApproved
имеет значение.Кроме того, когда я жду достаточно (~ 5 с), пока выполняется отладка на каждой итерации, все работает как положено.Может быть, есть поздняя ссылка, которая не await
для завершения какого-либо процесса?
Во время написания этого поста я провел некоторое тестирование.Если я изменю IQueryable
на IEnumerable
, он будет работать как положено.После еще нескольких копаний я обнаружил:
Queryable.Concat (IQueryable, IEnumerable) Метод
Enumerable.Concat (IEnumerable, IEnumerable) Метод
Итак, я предполагаю, что если я передам IQueryable
вместо IEnumerable
в Queryable.Concat()
, то я потеряю некоторые ссылки?Я так растерялся.