2012-07-30 71 views
1

我有实体的名单,其中实体喜欢使用多组通过选择一个记录和统计

发售

Int OfferId 
DateTime FromDate 
DateTime ToDate 
Bool Status 

List<Offer>,它具有复制OfferId以及 EG 。

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} 

因为,这OFFERID这是具有这是01/01/2011最古老没有fromdate它也有最频繁的没有fromdate这是01/01/2011。 (01/01/2011是出现3次在主列表没有fromdate)

+0

这是优先考虑最早还是最频繁? – Hogan 2012-07-30 14:06:37

+0

@Hogan:需要检查最早的最早的和最老的一组,最频繁的日期 – 2012-07-30 14:07:41

+0

如果最早的日期不是最频繁的开始日期,会发生什么? – PCasagrande 2012-07-30 14:40:07

回答

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(); 
+0

我已更新问题请看看! – 2012-07-30 14:35:56

+0

@huMptyduMpty - 确定它现在 - 只需要拿出最后一个'First()' – Hogan 2012-07-30 14:55:42

+0

辉煌,谢谢! – 2012-07-30 15:04:10

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(); 

未测试虽然

+0

感谢您的回答,但这会返回多个offerid的记录。我只需要记录一个符合我在问题中提到的条件的offer ID。这也是检查最多发生在日期? – 2012-07-30 14:16:13

+0

编辑答案... – 2012-07-30 14:28:42

+0

请看看更新的问题! – 2012-07-30 14:36:32