В данной статье поговорим о классе DataView, представляющего возможность отбирать табличные данные из объектов DataTable по задаваемым критериям.
Имея в базе данных таблицу Peoples со следующей структурой:

Мы можем получить соответствующий объект DataTable, содержащий все записи из таблицы Peoples.
Сейчас не будем вдаваться в подробности создания и заполнения объектов DataTable, а представим, что уже имеем заполненный объект DataTable MyDataTable.
Теперь необходимо по какому-нибудь критерию отобрать (отфильтровать) определенные записи из таблицы MyDataTable.
Для этого существует объект DataView. Для его создания необходимо вызвать конструктор и в качестве входного параметра передать объект DataTable, для которого будет выполняться фильтрация:
DataView MyDataView = new DataView(MyDataTable);
Но если мы не укажем строку фильтрации, то только что созданный объект MyDataView будет содержать те же записи, что и MyDataTable.
Поэтому важным шагом является установка свойства RowFilter:
MyDataView.RowFilter = "id = 74";
Такой записью, мы получим в итоговом объекте DataView всего одну запись из таблицы MyDataTable, значение поля id у которой равно 74.
В действительности, синтаксис определения фильтров запросив для объекта DataView проактически идентичен SQL-запросам. Поэтому я покажу еще пару примеров создания болем сложных запросив:
//все записи с значением id больше 74
MyDataView.RowFilter = "id > 74";
//все записи с значением id меньше, или равным 74
MyDataView.RowFilter = "id <= 74";
//все записи с значением id равным или 1, или 10, или 100
MyDataView.RowFilter = "id IN (1,10,100)";
//все записи с значением поля Name
//или Саша, или Петя, или Марина.
MyDataView.RowFilter = "[Name] IN ('Саша','Петя','Марина')";
Стринговые значения, в отличие от числовых указываются с одинарными кавычками.
//все записи с любым значением поля Name
//кроме Саша, Петя, Марина.
MyDataView.RowFilter = "[Name] NOT IN ('Саша','Петя','Марина')";
//все записи значение поля Name у которых содержит символ а.
MyDataView.RowFilter = "[Name] LIKE '%а%'";
//все записи у которых значение поля Name
//заканчивается символом а.
MyDataView.RowFilter = "[Name] LIKE '%а'";
//все записи у которых значение поля Name
//начинается символом а.
MyDataView.RowFilter = "[Name] LIKE 'а*'";
//все записи у которых значение поля Name
//не начинается символом а.
MyDataView.RowFilter = "[Name] NOT LIKE 'а*'";
//все записи у которых PostNumber больше 1000
//и имя (поле Name) заканчивается на ский.
MyDataView.RowFilter = "PostNumber>1000 AND Name Like '%ский'";
//все записи у которых PostNumber больше 1000
//или имя (поле Name) заканчивается на ский.
MyDataView.RowFilter = "PostNumber > 1000 OR Name Like '%ский'";
Также возможно использовать агрегирующие функции COUNT, SUM, MIN, MAX, AVG:
//все строки, значение PostNumber у которых больше,
//или равно среднему значению по всем строкам.
MyDataView.RowFilter = "PostNumber >= AVG(PostNumber)";
А что ,если необходимо обнаружить наличие в числовом значении присутствие определенных цифр?! В таких случая следует числовые типы предварительно приводить к стринговым литералам с помощью функции Convert:
string filter = string.Format("[Name] Like '%{0}%' " +
"AND Convert(PostNumber,'System.String')" +
"Like '%{1}%' AND PhoneNumber Like '%{2}%'",
"аша", "45", "8067-37-"
);
MyDataView.RowFilter = filter;
В следующей статье мы поговорим о включении в запросы нестандартных и зарезервированных служебных символов.