Фильтровать записи по времени с помощью Dataview Rowfilter

#c# #asp.net #sql #dataview #rowfilter

#c# #asp.net #sql #dataview #rowfilter

Вопрос:

Возможно ли получать записи между временными интервалами из DataTable, используя свойство RowFilter Defaultview, которое принадлежит таблице.

Цель: Я хотел бы проверить, Current Time(DateTime.Now.ToString()) укладывается ли время в рамки, определенные в схеме таблицы базы данных. Схема таблицы определена ниже

                           `Name | From | To | JoinedOn |`
  

где From To — это столбцы datetime в таблице базы данных. Я хотел бы сравнить только значения времени из столбцов datetime, а также даты. Я пробовал ниже, но результата не дает.
dt_Temp.DefaultView.RowFilter = "From < '" DateTime.Now.ToString() "' AND To >'" DateTime.Now.ToString() "'"; у кого-нибудь есть идеи?

Технические характеристики:

.Net Framework 2.0

ViSual studio 2005

Sql server express 2005

Ответ №1:

Я бы пропустил DefaultView и вместо этого написал запрос Linq для DataTable

 var time = DateTime.Now.TimeOfDay;
var q = 
  from row in dt_Temp.AsEnumerable();
  where row.Field<DateTime>("From").TimeOfDay < time amp;amp; row.Field<DateTime>("To").TimeOfDay  > time
  select row;
  

Редактировать
Вот совместимая с 2.0 функция этого запроса

 private static IEnumerable<DataRow> GetRows(DataTable dt_Temp)
{
    TimeSpan time = DateTime.Now.TimeOfDay;
    foreach (DataRow row in dt_Temp.Rows)
        if(((DateTime)row["From"]).TimeOfDay < time amp;amp; ((DateTime)row["To"]).TimeOfDay > time)
            yield return row;
}
  

Комментарии:

1. @Magnus извините, я забыл указать версию моего фреймворка. Я использую 2.0 для приложения. Клиенту нужно убрать Linq с пути

2. @Magnus Аккуратно написанный и IEnumurable работает очаровательно, но из любопытства, что было не так с dataview и rowfilter, разве это недостаточно эффективно?

3. Не уверен, как бы я написал такой фильтр только для сравнения временных отрезков. Также мне нравится работать со строго типизированными объектами.

4. @Magnus принят в качестве ответа, и должен ли метод быть статическим, это обязательная вещь? разве метод не должен возвращать строки, которые должны быть перечислимыми, а не DataRow

5. Не обязательно быть статичным. Если вы хотите использовать yield return , то возвращаемый тип должен быть IEnumerable<DataRow> (набор строк)

Ответ №2:

Поражен собственным интеллектом 🙂 приведенный ниже rowfilter отвечает на мой запрос

"From <= #" DateTime.Now.ToString() "# AND To >#" DateTime.Now.ToString() "#";