У меня есть приложение. NET Forms, которое представляет собой систему отслеживания производства. У меня есть DataGridView и несколько ListViews с проверяемыми элементами для фильтрации таблицы данных. Фильтры включают номер детали, номер заряда, текущее местоположение и т. Д. c. Есть 9 ListViews и 2 TextBox (входные данные тщательно проверены). Сейчас я использую For l oop для отмеченных элементов, чтобы добавить их в предложение Where запроса SQL. Я обеспокоен тем, что мои запросы могут стать очень неэффективными. Запрос включает в себя 13 объединений, а основная таблица, к которой я обращаюсь, содержит около 2000 строк, но я вижу, что в следующие несколько лет она достигнет 100 000.
string query = @"SELECT top 1000 [column names] FROM [table names and joins] ";
List<string> filters = new List<string>();
//
// Part Number
//
if (ListViewPartNumber.CheckedItems.Count != 0)
{
string PartNumberFilterString = " ( ";
for (int i = 0; i < ListViewPartNumber.CheckedItems.Count; i++)
{
int PN_ID = ListViewPartNumber.GetCheckedValue( i );
PartNumberFilterString += "SubAssembliesTable.PN_ID = " + PN_ID;
if ( i < ListViewPartNumber.CheckedItems.Count - 1 )
PartNumberFilterString += " OR ";
}
PartNumberFilterString += " ) ";
filters.Add(PartNumberFilterString);
}
Добавляется в список фильтров для каждого списка, в котором отмечены элементы. Затем он объединяет их в одну строку для запроса к базе данных.
//
// Create filter string
//
for ( int i = 0 ; i < filters.Count ; i++ )
{
if ( i == 0 ) query += "\r\n where ";
query += filters[ i ];
if ( i < filters.Count - 1 ) query += " AND ";
}
query += " \r\nORDER BY [ColumnName] desc ";
Работает нормально, проблем с производительностью не замечено, но я беспокоюсь, что делаю это совершенно неправильно. Запрос может закончиться десятками AND и OR.