到目前为止,我在做什么:
实体:
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
有值的话),将不胜感激。另外,当我等待足够长的时间(〜5s)时,在每次迭代调试时,它都能按预期工作。也许有一个较晚的参考文献没有await
完成某个过程?
在撰写本文时,我做了一些测试。如果我将IQueryable
更改为IEnumerable
,它将按预期工作。经过进一步的挖掘,我发现了这一点:
Queryable.Concat(IQueryable,IEnumerable)方法
Enumerable.Concat(IEnumerable,IEnumerable)方法
因此,我假设如果我将IQueryable
而不是IEnumerable
传递给Queryable.Concat()
,那么我会丢失一些引用吗?我很困惑。