2011-07-26 38 views
2

範圍我有一個集團通過特定的時間在LINQ

List<Advertisement> 

其中Advertisement包含

public DateTime StartDate { get; set; } 
public DateTime EndDate { get; set; } 

我想要做的是組內的List<Advertisement>三個特定的時間要素使用範圍通過...分組。在三個時間段,分別爲:

  • x => x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(1))
  • x => x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(7))
  • x => x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(365))

所以在最後一天的開始日期,開始日期元素在上週和元素與元素在去年的開始日期。

來自上一年的元素組應該包含那些在上週和上一天有開始日期的元素。而上週的這組元素應該包含最後一天的元素。

我只是不能想到如何做到這一點。乾杯。

回答

3

正如你希望每個組還包括先前組的內容(例如過去一週包括最後一天),我已經構建聯合查詢

var today=items.Where(l=>l.StartDate>DateTime.Now.Subtract(TimeSpan.FromDays(1))); 
var lastweek=items.Where(l=>l.StartDate>DateTime.Now.Subtract(TimeSpan.FromDays(7))); 
var lastyear=items.Where(l=>l.StartDate>DateTime.Now.Subtract(TimeSpan.FromDays(365))); 


var result = today.Select(d => new { Group="Last Day",item=d}) 
        .Union(lastweek.Select(w => new {Group="Last Week",item=w})) 
        .Union(lastyear.Select(y => new {Group="Last Year",item=y})) 
        .GroupBy (l => l.Group,l=>l.item); 

如何這個查詢的工作原理是它創造3個查詢選擇相關數據。 然後每個查詢使用select操作符來選擇投影到匿名對象中的匹配組名稱和原始項目。 (基本上創建一個新的對象,其中groupname作爲一個屬性,而原始的Item作爲另一個屬性)。 然後,我使用union將多個結果組合在一個大列表中。 (Union有附加屬性,它可以去除重複項,但不應該有)。一旦我有了大名單,我可以通過groupname進行分組,第二個參數基本上將原始項目放回爲組值。

+0

用於回答OP所要求的內容 –

+0

您是否可以通過您的工會查詢以通俗的語言來處理? – endorphin

+0

添加說明 –

0

您可以創建一個方法(或擴展),它將返回某個特定組的值,然後通過它進行分組。

+0

哈哈,打我5秒 –

+0

但有些廣告可能會出現在兩個或三個組。那麼是不是將某些功能分組限制在一個組中? – endorphin

+0

這就是我認爲的分組功能的一個點... –

0

一種方法可能是編寫一個擴展方法,它返回它所屬的類別。

public static int GetCategory(this Advertisement advert) 
{ 
    if(x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(1))) 
    { 
     return 1; 
    } 
etc... 
} 

然後你可以通過GetCategory屬性進行分組。返回一個Enum而不是一個整數可能會更好。

+0

這不會工作,因爲上週必須包括最後一天 –

+0

我同意,考慮到這一點......但羣組不是正確的功能那。我認爲OP在使用錯誤的功能。 –

+0

我同意,我的答案使用group by,因爲它被要求提供,但是從我的答案中創建一個新的數組並不需要使用group。 –