2013-05-08 2 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? - подробнее, пожалуйста! ;-) –

ответ

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

Я отщепляюсь year и month как отдельные параметры, а это, как вы описали их - если вы действительно хотите, чтобы быть в состоянии справиться «01/2013», вы, вероятно, захотите просто разделить на '/' и сначала разобрать каждую часть в виде целых чисел. (В качестве альтернативы, проанализируйте его как дату в определенном формате, а затем возьмите год и месяц с этого.)

EDIT: Обратите внимание, что форматирование каждого значения в виде строки бессмысленно и потенциально некорректно, если вы не будете осторожны. (Например, если вы не указали культуру явно, если вы используете / в шаблоне, вы получите разделитель дат текущей культуры, который, возможно, не так, как вы ожидаете.)

Вы на самом деле не пытаетесь сопоставить шаблон строки - вы пытаетесь проверить год и месяц даты. Это то, что ясно выражает код выше. Форматирование строк является неуместным.

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

«Правильно ли это сделать?» - На мой взгляд, нет. Вы не логически выполняете сравнение строк; вы выполняете сравнение за месяц и год. Поэтому сначала конвертируйте свои входные данные в месяц и год и используйте эти значения для сравнения месяца и года каждого элемента. –

0

Это верно только для моли и год

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