2

我正在尝试使用 Ef 核心和 Ardalis 规范查询我的 postgresql 数据库。

对于我构建的查询,我想通过使用 OrderBy 和嵌套对象上的属性的聚合来对结果进行排序。

我想要的排序是按评分最高的诊所对诊所列表进行排序。等级为 1-5。

因此,如果一个诊所有两个评分为 5 的评论,它应该排在一个有 5 条评分为 2 或评分为 4 的评论的诊所之上。为此,我必须计算平均值,然后按最高值排序

public class Clinic
    {
        public int Id { get; set; }
        public ICollection<Review> Reviews {get; set;}
    }

public class Review
    {
        public int Id { get; set; }
        public decimal Grade {get; set;}
    }

到目前为止,我的查询没有按预期工作,因为它只能获得最高值。我可以以某种方式在这里插入平均值计算吗?

public ClinicFilterPaginatedSpecification()
{
   Query.OrderByDescending(x => x.Reviews.Max(x => x.Grade ));
}

运行查询:

var filterSpec = new ClinicFilterSpecification();
var itemsOnPage= await _clinicRepo.ListAsync(filterSpec);
4

2 回答 2

0

我应该提到这与 Specification 包没有直接关系,因为表达式没有以任何方式改变。无论在 EF 上如何工作,都应该通过规范来工作。我们按原样传递表达式。

现在的问题是,当您需要从集合中聚合一些数据时,EF 在这种情况下的表现如何。我认为这在 EF Core 5 中进行了优化,Ardalis 的建议应该可行。在 EF Core 3 之前,此方案将涉及显式加入操作(不太确定)。

于 2021-04-26T19:04:03.313 回答
0

正如 Ivan Stoev 在他的评论中指出的那样,您应该能够使用以下.Average()命令:

public ClinicFilterPaginatedSpecification()
{
   Query.OrderByDescending(clinic => clinic.Reviews.Average(review => review.Grade ));
}

你有没有试过这个,如果是这样,它是工作还是产生错误?

于 2021-04-26T14:16:52.413 回答