Вы можете использовать условное выражение для группировки на основе вашего состояния, а затем получить минимальную цену для каждой группы, которая будет одной гостиницей, если не найдено ни одного 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
для необычных группировок.