2014-10-08 6 views
2

Я хотел бы запросить db для элементов с датой, которая больше или равна заданной дате.Сравнение дат в linq

Дата в db - это дата и время записи.

Если пользователь вводит строку поиска «1/30/2014», они ожидают записи, которые произошли в любое время в эту дату для возврата. Однако все, что имеет время после 12 часов утра, не возвращается.

Я знаю, что могу просто добавить день к строке поиска, но есть ли более подходящий способ?

if (form["closedend"] != "") 
{ 
    DateTime d = DateTime.Parse(form["closedend"]); 
    traces = traces.Where(s => s.date_Closed >= d); 
} 

ответ

7

Вы можете использовать Date property усечь часть времени:

traces = traces.Where(s => s.date_Closed.Date <= d.Date); 

На этом пути вы бы включить в этот день, так как оба DateTime s являются полночь.

Обновление при использовании LINQ для лиц DateTime.Date не поддерживается, вы могли бы использовать это решение: Using DateTime in LINQ to Entities

.Where(s => EntityFunctions.TruncateTime(s.date_Closed) <= EntityFunctions.TruncateTime(d)) 
+0

я не уверен, если OP использует Linq-to-Entities (они упоминают дб), но если они 'Date' не будут работать. – juharr

+0

thats right - Дата не доступна – tintyethan

+0

@tintyethan: я ее отредактировал. –

0

Вы сказали

с датой, большей или равной заданной дата

но в вашем коде вы пишете

s.date_Closed <= d 

Я думаю, вы должны изменить <= по >= для получения даты больше или равна г, теперь вы получаете даты меньше или равна г.

+0

Хороший улов - я обновил образец кода – tintyethan

0

Для этого примера вам не понадобится дополнительная DLL. Вы можете осуществлять другие функции, которые возвращают bool, Fe:

public bool MyFunction(DateTime s) 
{ 
    DateTime d = DateTime.Parse(Your constructor); 
    return (s.date_Closed >= d); 
} 

var query = from obj in traces 
      where MyFunction(obj.date_Closed.Date) 
      select obj; 

или:

var query = traces.Where(p => MyFunction(p.data_Closed.Date));