2013-05-08 132 views
2
public class content 
{ 
    public int Id { get; set; } 
    public string name { get; set; } 
    public DateTime date { get; set; } 
} 


Id name  date 
1 content1 01/01/2013 
2 content2 05/01/2013 
3 content3 05/03/2013 
4 content4 01/06/2013 
5 content5 10/03/2012 
6 content6 01/01/2012 

我想如果查詢通過'01/2013',查詢應返回內容ID 1,2。 有沒有人知道如何查詢上面的情況?Linq查詢按日期篩選(月份和年份)

+1

它是LINQ2SQL,Linq2Objects,Linq2Entities是否正確? - 更多細節,請! ;-) – 2013-05-08 13:40:22

回答

11

看起來你應該能夠做到:

// Type and property names changed to match .NET conventions 
public IEnumerable<Content> GetContents(int year, int month) 
{   
    return db.Contents // Or wherever you're getting data from 
      .Where(c => c.Date.Year == year && c.Date.Month == month); 
} 

我已經打出了yearmonth作爲單獨的參數,因爲這是你如何描述他們 - 如果你真的希望能夠處理「01/2013」​​你可能只想分割'/'並首先將每個片段解析爲一個整數。 (或者,將其解析爲特定格式的日期,然後從中取出年份和月份。)

編輯:請注意,將每個值格式化爲字符串是毫無意義的,並且可能不正確,除非您小心。 (例如,除非明確指定文化,否則如果在模式中使用/,則會得到當前文化的日期分隔符,這可能不是您所期望的。)

您實際上並未嘗試匹配一個字符串模式 - 您正在嘗試測試日期的年份和月份。這就是上面的代碼清楚地表達的。字符串格式化是無關緊要的。

0

我突然摸索出象下面這樣:

public IEnumerable<Content> GetContents(string date) /* E.G: date = '07/2013' */ 
{   
    return db.Contents // Or wherever you're getting data from 
      .Where(c => c.Date.ToString("MM/yyyy") == date); 
} 

那是正確的方法呢?

+2

「這是正確的做法嗎?」 - 在我看來,不是。你不是在邏輯上執行字符串比較;你正在執行一個月和一年的比較。因此,首先將輸入數據轉換爲月份和年份,然後使用這些值比較每個元素的月份和年份。 – 2013-05-08 15:08:44

0

這是隻飛蛾和年

List<eTransaction> lsttrans = db.eTransactions.Where(c => c.SchemeID == scid && 
    c.DateOfPay.Value.Month == month && c.DateOfPay.Value.Year == year).ToList();