使用多个group by和count选择一个记录

时间:2012-07-30 14:03:42

标签: c# .net linq .net-4.0 lambda

我有一个实体喜欢的实体列表

优惠

Int OfferId
DateTime FromDate
DateTime ToDate
Bool Status

List<Offer>中,它也有重复OfferId 例如。

Offer1 { Id=1, From=01/01/2011, To=31/01/2011, Status=true }
Offer2 { Id=1, From=01/02/2011, To=28/02/2011, Status=false}
Offer2 { Id=2, From=01/02/2011, To=28/02/2011, Status=false}
Offer3 { Id=3, From=01/01/2011, To=31/01/2011, Status=true }
Offer4 { Id=4, From=01/01/2011, To=31/01/2011, Status=true }
Offer5 { Id=1, From=01/03/2011, To=31/03/2011, Status=false}

我要做的是选择与一个offerId相关的优惠列表,其中startdate具有最早且频繁offerId=1。 在这种情况下,它是01/01/2011的一次。因为它具有最早且最频繁的开始日期offerId 我不确定如何将所有条件都放在一个命令中。

我根据var list = OfferList.GroupBy(a => a.offerId).Select(g => g.Select(s => s)); 对记录进行了分组,但我不确定如何继续

Offer1 { Id=1, From=01/01/2011, To=31/01/2011, Status=true }
Offer2 { Id=1, From=01/02/2011, To=28/02/2011, Status=false}
Offer5 { Id=1, From=01/03/2011, To=31/03/2011, Status=false}

更新

似乎有点混乱。我正在尝试选择满足条件的列表或记录。 在这种情况下,答案应该是

{{1}}

因为,这个 1 的offerid拥有最早的fromdate 01/01/2011 ,它也有最常见的fromdate, 01/01/2011 。 (01/01/2011在主列表中出现3次)

2 个答案:

答案 0 :(得分:1)

var q = from t in offerList
        group t by new { t.Id } into grp
        select new
        {
           grp.Key.Id,
           MinDate = grp.Min(t => t.From)
        };
var re = q.ToList().OrderBy(p=>p.MinDate).FirstOrDefault();

虽未经过测试

答案 1 :(得分:1)

您可以在这里进行LinqPad测试:https://gist.github.com/3207484

var r = (OfferList.GroupBy(offer => offer.id)
             .Select(group =>
                 new { offerid = group.Key,
                       offers = group.OrderBy(o => o.fromDt),
                       count = group.Count() })
             .OrderBy(g => g.offers.First().fromDt) // list with the oldest
             .ThenByDescending(g => g.count)).Dump()  // then by most
        .First().offers.First();