我有以下收藏模型:酒店
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
有人可以帮助我解决此查询吗?
答案 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
表达式对异常分组的好处的文章。