【问题标题】:While fetching all records from the DB, assign to a ViewModel attribute average rating for each record从数据库中获取所有记录时,为每条记录分配一个 ViewModel 属性平均评分
【发布时间】:2017-09-10 23:57:48
【问题描述】:

基本上,我是从某个表中获取所有记录,然后选择一个新的 VM 类。我想出了这个代码来计算平均评分,但是,代码产生了正确的平均值(按获取的对象的 ID 分组)。问题是,这些平均值/值采用IQueryable 的形式,而我需要将它们分别分配给相应的记录。

return _ctx.LodgingDbSet.Select(x => new LodgingVM
{
    LodgingId = x.Id,
    LodgingName = x.Name,
    LodgingAddress = x.Address,
    LodgingEmail = x.Email,
    LodgingPhone = x.Phone,

    LodgingAverageRating = _ctx.RatingDbSet.GroupBy(
           g => g.Reservation.Unit.LodgingId, r => r.Score)
                .Select(g => new
                {
                    LodgingId = g.Key,
                    Score = g.Average()
                }).Select(g => g.Score),

            LodgingImage = x.Image,
            LodgingImageThumb = x.ImageThumb

        }).OrderBy(o => o.LodgingName).ToList();

VM 属性LodgingAverageRating 应该只包含该特定住宿的平均值。目前,我用于计算平均值的代码会返回所有计算出来的平均值。

【问题讨论】:

  • _ctx.RatingDbSet.Where(r => r.Reservation.Unit.LodgingId == x.Id).GroupBy(..... 试试这个..
  • @ChetanRanpariya 是的,因为涉及到正确的过滤,现在我得到了一个结果,可以根据需要得到一个结果,并且可以在最后使用 FirstOrDefault() 。请为此提议创建一个答案,以便我接受。

标签: c# asp.net linq


【解决方案1】:

尝试使用GroupJoin加入并分组结果然后使用Average扩展方法?

return _ctx.LodgingDbSet.GroupJoin(_ctx.RatingDbSet,
                            lodging => lodging.Id,
                            rating => rating.Reservation.Unit.LodgingId,
                            (l, groupedRating) => new LodgingVM
                            {
                                LodgingId = x.Id,
                                LodgingName = x.Name,
                                LodgingAddress = x.Address,
                                LodgingEmail = x.Email,
                                LodgingPhone = x.Phone,
                                LodgingAverageRating = groupedRating.Average(x => x.Score),
                                LodgingImage = x.Image,
                                LodgingImageThumb = x.ImageThumb
                            }).OrderBy(o => o.LodgingName).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2018-07-12
    • 2022-08-05
    • 2021-11-03
    相关资源
    最近更新 更多