IQueryable.Concat,IEnumerable.Concat,Linq在每个组中按GroupBy然后按OrderBy

时间:2019-03-21 15:59:21

标签: c# linq .net-core ienumerable iqueryable

到目前为止,我在做什么:

实体:

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();
}

我遇到的问题是当我遍历GetAllAsyncIsApproved的结果时有一个值,Approval设置为null 。如果我只返回requests而不进行连接,它会按预期工作(创建了对象,但其中的值为null)。

我怀疑问题在于连接两个查询。如何重写单个查询中的内容?

应按已处理和未处理的请求(IsApproved == nullIsApproved != null)对请求进行分组,然后按CreatedOn以不同的顺序进行排序。

如果有人可以向我解释为什么在串联后将Approval设置为null(如果IsApproved有值的话),将不胜感激。另外,当我等待足够长的时间(〜5s)时,在每次迭代调试时,它都能按预期工作。也许有一个较晚的参考文献没有await完成某个过程?

在撰写本文时,我做了一些测试。如果我将IQueryable更改为IEnumerable,它将按预期工作。经过进一步的挖掘,我发现了这一点:

  

Queryable.Concat(IQueryable,IEnumerable)方法

     

Enumerable.Concat(IEnumerable,IEnumerable)方法

因此,我假设如果我将IQueryable而不是IEnumerable传递给Queryable.Concat(),那么我会丢失一些引用吗?我很困惑。

0 个答案:

没有答案