#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() "#";