У меня есть 5 элементов управления на моей веб-странице, например txtFirstName
(TextBox), txtDisplayName
(TextBox), txtFromDate
(TextBox), txtToDate
(TextBox) и btnFilter
(кнопка). Также я привязываю некоторые данные на одной странице GridView с помощью DataTable.
Теперь я хочу отфильтровать DataTable, используя эти параметры параметров поиска, о которых я упомянул выше.
Состояние фильтра,
Мы не уверены в заполненных элементах управления и пустых элементах управления. Поэтому на основе ввода, введенного в элементы управления, нам необходимо отфильтровать DataTable. Если значения управления пустые, мы не должны позволять им фильтровать Datatable.
Нам нужно отфильтровать значения данных оператором LIKE или String.Startswith()
Если txtFromDate и txtToDate заполнены, нам нужно отфильтровать значения данных между диапазоном.
Если все элементы управления заполнены, нам необходимо отфильтровать данные на основе всех параметров фильтра с диапазоном дат.
Как мы достигаем этой фильтрации? Пожалуйста, помогите мне реализовать это успешно. Можем ли мы это сделать с помощью выражения LINQ или Lamda? Если да, скажите мне предложения.
Я пробовал два пути, но не работал,
Первый путь:
var test=dtActions.AsEnumerable().Where(z=>
!string.IsNullOrEmpty(txtFirstName.Text)? z.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) &&
!string.IsNullOrEmpty(txtDisplayName.Text)?z.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper()) &&
!string.IsNullOrEmpty(txtCreatedBy.Text)?z.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper());
У меня нет идеи получить данные между текстовыми полями DateTime.
Второй способ:
var results = from dataRow in dtActions.AsEnumerable()
where dataRow.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) ||
dataRow.Field<string>("DisplayName").ToUpper().StartsWith(txtFirstName.Text.ToUpper()) ||
((dataRow.Field<DateTime>("CreatedDate")>= Convert.ToDateTime(txtFromDate.Text)) && (dataRow.Field<DateTime>("CreatedDate")<= Convert.ToDateTime(txtToDate.Text)))
select dataRow;
Следующие работы кода:
var test = dtActions.AsEnumerable().Where(z =>
(string.IsNullOrEmpty(txtFirstName.Text) ? true : z.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper())) &&
(string.IsNullOrEmpty(txtDisplayName.Text) ? true : z.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper())) &&
(string.IsNullOrEmpty(txtCreatedBy.Text) ? true : z.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper()))
);
Ваш второй запрос
var results = from dataRow in dtActions.AsEnumerable()
where (string.IsNullOrEmpty(txtFirstName.Text) ? true : dataRow.Field<string>("FirstName").ToUpper().StartsWith(txtFirstName.Text.ToUpper())) ||
(string.IsNullOrEmpty(txtDisplayName.Text) ? true : dataRow.Field<string>("DisplayName").ToUpper().StartsWith(txtDisplayName.Text.ToUpper())) ||
(string.IsNullOrEmpty(txtCreatedBy.Text) ? true : dataRow.Field<string>("CreatedBy").ToUpper().StartsWith(txtCreatedBy.Text.ToUpper())) ||
(dataRow.Field<DateTime>("CreatedDate") >= Convert.ToDateTime(txtFromDate.Text) && (dataRow.Field<DateTime>("CreatedDate") <= Convert.ToDateTime(txtToDate.Text)))
select dataRow;
Причина, по которой ваш код не работает, является некорректным условным оператором. Если строка является пустой или пустой, мы возвращаем true, иначе мы проверяем значение поля.
Примените ToList()
если вы хотите, чтобы List в конце или ToArray()
если вы хотите, чтобы он был массивом.
вы проверяли фильтры dataview? http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx
dt.AsEnumerable().Where(x=> x["id" ==1).ToList()