Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Фильтрация с помощью DataView (linq to DataSet)

Возможность фильтрации данных на основе заданных критериев и их предоставление клиенту с помощью элемента управления в пользовательском интерфейсе — это важный аспект привязки данных. Объект DataViewреализует несколько способов фильтрации и возвращения подмножеств строк данных, отвечающих определенным критериям фильтрации. Кроме возможностей фильтрации на основе строк, объектDataViewтакже позволяет использовать в критериях фильтрации выражения LINQ. Выражения LINQ позволяют выполнять гораздо более сложные и мощные операции фильтрации, чем фильтрация на основе строк.

Существует два способа фильтрации данных с помощью объекта DataView.

  • Создайте объект DataViewна основе запроса LINQ to DataSet с предложением WHERE.

  • Используйте существующие возможности фильтрации на основе строк, предоставляемые объектом DataView.

Создание объекта DataView на основе запроса с данными фильтрации

Объект DataViewможно создать с помощью запроса LINQ to DataSet. Если запрос содержит предложение Where, объектDataViewбудет создан с учетом данных фильтрации из этого запроса. Выражение в предложении Where используется для определения того, какие строки данных будут включены в объектDataView, и является основой для фильтра.

Фильтрация на основе выражений является более сложной и мощной, чем более простая фильтрация на основе строк. Фильтры на основе строк и выражений взаимно исключают друг друга. Если фильтрация на основе строк RowFilterзадается после создания объектаDataViewна основе запроса, выводимый из запроса фильтр на основе выражений очищается.

Примечание

В большинстве случаев выражение, используемое для фильтрации, не должно иметь побочных эффектов и должно быть детерминированным. Также эти выражения не должны содержать логику, зависящую от заданного количества выполнений, так как операции фильтрации могут выполняться любое количество раз.

Пример

В следующем примере выполняется запрос к таблице SalesOrderDetail и возвращаются строки с количеством больше 2, но меньше 6, на основе этого запроса создается объект DataView, который привязывается кBindingSource.

C#

DataTable orders = dataSet.Tables["SalesOrderDetail"];

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()

where order.Field<Int16>("OrderQty") > 2 && order.Field<Int16>("OrderQty") < 6

select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

Пример

В следующем примере объект DataViewсоздается на основе заказов, размещенных позже 6 июня 2001 г.:

C#

DataTable orders = dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()

where order.Field<DateTime>("OrderDate") > new DateTime(2002, 6, 1)

select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

Пример

Фильтрация может быть совмещена с сортировкой. В следующем примере объект DataViewсоздается на основе запроса на получение контактов с фамилией, начинающейся на букву «S», отсортированных сначала по фамилии, а затем по имени:

C#

DataTable contacts = dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()

where contact.Field<string>("LastName").StartsWith("S")

orderby contact.Field<string>("LastName"), contact.Field<string>("FirstName")

select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();

Пример

В следующем примере алгоритм SoundEx используется для поиска контактов с фамилией, сходной с «Zhu». Алгоритм SoundEx реализуется в методе SoundEx.

C#

DataTable contacts = dataSet.Tables["Contact"];

string soundExCode = SoundEx("Zhu");

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()

where SoundEx(contact.Field<string>("LastName")) == soundExCode

select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();

SoundEx — это фонетический алгоритм, используемый для индексирования имен по их звучанию на английском языке. Он был разработан в бюро переписи населения США. Метод SoundEx возвращает четырехзначный код имени, состоящий из английской буквы и трех цифр. Буква — это первая буква имени, а цифры обозначают остальные согласные в имени. Сходно звучащие имена имеют одинаковый код SoundEx. Реализация алгоритма SoundEx, используемого в методе SoundEx в предыдущем примере, показана здесь:

C#

static private string SoundEx(string word)

{

// The length of the returned code.

int length = 4;

// Value to return.

string value = "";

// The size of the word to process.

int size = word.Length;

// The word must be at least two characters in length.

if (size > 1)

{

// Convert the word to uppercase characters.

word = word.ToUpper(System.Globalization.CultureInfo.InvariantCulture);

// Convert the word to a character array.

char[] chars = word.ToCharArray();

// Buffer to hold the character codes.

StringBuilder buffer = new StringBuilder();

buffer.Length = 0;

// The current and previous character codes.

int prevCode = 0;

int currCode = 0;

// Add the first character to the buffer.

buffer.Append(chars[0]);

// Loop through all the characters and convert them to the proper character code.

for (int i = 1; i < size; i++)

{

switch (chars[i])

{

case 'A':

case 'E':

case 'I':

case 'O':

case 'U':

case 'H':

case 'W':

case 'Y':

currCode = 0;

break;

case 'B':

case 'F':

case 'P':

case 'V':

currCode = 1;

break;

case 'C':

case 'G':

case 'J':

case 'K':

case 'Q':

case 'S':

case 'X':

case 'Z':

currCode = 2;

break;

case 'D':

case 'T':

currCode = 3;

break;

case 'L':

currCode = 4;

break;

case 'M':

case 'N':

currCode = 5;

break;

case 'R':

currCode = 6;

break;

}

// Check if the current code is the same as the previous code.

if (currCode != prevCode)

{

// Check to see if the current code is 0 (a vowel); do not process vowels.

if (currCode != 0)

buffer.Append(currCode);

}

// Set the previous character code.

prevCode = currCode;

// If the buffer size meets the length limit, exit the loop.

if (buffer.Length == length)

break;

}

// Pad the buffer, if required.

size = buffer.Length;

if (size < length)

buffer.Append('0', (length - size));

// Set the value to return.

value = buffer.ToString();

}

// Return the value.

return value;

}