IQueryable.Concat, IEnumerable.Concat, Linq GroupBy, затем OrderBy в каждой группе - PullRequest
0 голосов
/ 21 марта 2019

Что я делаю до сих пор, так это:

Объекты:

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(), то я потеряю некоторые ссылки?Я так растерялся.

...