2013-05-08 105 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();