Как фильтровать данные с несколькими значениями столбцов, используя C #

1

У меня есть 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;
  • 3
    пожалуйста, отправьте код того, что вы пытались. Таким образом, мы можем проверить это на ошибки и предложить альтернативные решения
  • 0
    Используйте что-то вроде dt.AsEnumerable().Where(x=> x["id" ==1).ToList()
Показать ещё 7 комментариев
Теги:
linq
datatable

2 ответа

2
Лучший ответ

Следующие работы кода:

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() если вы хотите, чтобы он был массивом.

  • 0
    Теперь это работает. Огромное спасибо.
1

вы проверяли фильтры dataview? http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню