【问题标题】:join table and get the record which has minimum value?连接表并获取具有最小值的记录?
【发布时间】:2019-03-05 14:57:39
【问题描述】:

我有以下收藏模型:酒店

public class Hotel {
int HotelId {get;set;}
decimal Price {get;set;}
int vendorId {get;set;}
int vendorHotelId {get;set;}
}

记录会是这样的

HotelId Price VendorId VendorHotelId
1        100    1         0
2        200    2         0
3        300    1         0
4        400    2         1

如果 VendorHotelId 等于 HotelId 那么我需要选择 LINQ 中价格最低的记录。

我想要这样的结果

 HotelId Price VendorId VendorHotelId
    1        100    1         0
    2        200    2         0
    3        300    1         0   

谁能帮我解决这个问题?

【问题讨论】:

  • hotels.GroupBy(h => h.vendorHotelId).Select(g => g.OrderBy(h => h.Price).First()); 将为您提供由 vendorHotelId 定义的每个组中最便宜的酒店,假设 hotels 是所有酒店的集合。
  • 根据要求hotelId应该等于VendorHotelId。预期结果中的所有行都没有相同的 hotelId 和 VendorHotelId
  • @Matt.G 因为我从源中取了vendorhotelid等于hotelid的酒店,只挑了价格最便宜的酒店,所以从源中去掉了
  • 如何在结果中从源设置 VendorHotelId 为 0?
  • @Stemado,请咨询 OP

标签: c# linq collections


【解决方案1】:

您可以使用条件表达式根据您的条件进行分组,然后从每个组中获取最低价格,如果不存在匹配的vendorHotelId,则将是一个酒店。

var ans = (from h in hotels
           let hasVendor = h.vendorHotelId > 0
           group h by hasVendor ? h.vendorHotelId : h.HotelId into hg
           let hmin = hg.OrderBy(h => h.Price).First()
           select new {
               HotelId = hmin.HotelId,
               Price = hmin.Price,
               vendorId = hmin.vendorId
           })
          .ToList();

更新:由于您的评论似乎使用了流利的语法,因此这里是一个翻译:

var ans2 = hotels.Select(h => new { h, hasVendor = h.vendorHotelId > 0 })
                 .GroupBy(hv => hv.hasVendor ? hv.h.vendorHotelId : hv.h.HotelId, hv => hv.h)
                 .Select(hg => hg.OrderBy(h => h.Price).First())
                 .Select(hmin => new {
                     HotelId = hmin.HotelId,
                     Price = hmin.Price,
                     vendorId = hmin.vendorId
                 })
                 .ToList();

注意:有人应该在某个地方写一篇文章,介绍条件 GroupBy 表达式对异常分组的优势。

【讨论】:

    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2022-07-21
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多