连接表并获取具有最小值的记录?

时间:2019-03-05 14:57:39

标签: c# linq collections

我有以下收藏模型:酒店

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   

有人可以帮助我解决此查询吗?

1 个答案:

答案 0 :(得分:0)

您可以使用条件表达式根据您的条件进行分组,然后从每个组中获取最低价格,如果不存在匹配的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表达式对异常分组的好处的文章。