Помогите с запросом SQL

207
12 марта 2018, 23:56

Есть TextBox в который вводятся буквы и по этим буквам база выдает мне результат поиска. Вот код:

private void tbSearchPC_KeyUp(object sender, KeyEventArgs e)
{
    string fullPath = Path.GetFullPath("Database.mdf");
    string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=" + fullPath + ";Integrated Security=True";
    myConnection = new SqlConnection(connectionString);
    myConnection.Open();
    if(Menu1_1On == 1)
        query = "SELECT * FROM Computers WHERE (Name) LIKE (N'%" + tbSearchPC.Text + "%')";
    if (Menu1_2On == 1)
        query = "SELECT * FROM Laptops WHERE (Name) LIKE (N'%" + tbSearchPC.Text + "%')";
    if (Menu1_3On == 1)
        query = "SELECT * FROM Smartphones WHERE (Name) LIKE (N'%" + tbSearchPC.Text + "%')";
    if (Menu1_4On == 1)
        query = "SELECT * FROM Tablets WHERE (Name) LIKE (N'%" + tbSearchPC.Text + "%')";
    SqlCommand command = new SqlCommand(query, myConnection);
    SqlDataReader reader = command.ExecuteReader();
    GetData(reader);
}

Также есть кнопка сортировки по возрастанию и по убыванию. Вот код:

private void SortUpToDown(string sender)
{
    string fullPath = Path.GetFullPath("Database.mdf");
    string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=" + fullPath + ";Integrated Security=True";
    myConnection = new SqlConnection(connectionString);
    myConnection.Open();
    if (sender == "Name")
    {
        if (Menu1_1On == 1)
            //query = "SELECT * FROM Computers ORDER BY Name ASC and WHERE (Name) LIKE (N'%" + tbSearchPC.Text + "%'"; //<- пытался сделать что-то вроде этого
            query = "SELECT * FROM Computers ORDER BY Name ASC";
        if (Menu1_2On == 1)
            query = "SELECT * FROM Laptops ORDER BY Name ASC";
        if (Menu1_3On == 1)
            query = "SELECT * FROM Smartphones ORDER BY Name ASC";
        if (Menu1_4On == 1)
            query = "SELECT * FROM Tablets ORDER BY Name ASC";
    }
    if (sender == "Price")
    {
        if (Menu1_1On == 1)
            query = "SELECT * FROM Computers ORDER BY Price ASC";
        if (Menu1_2On == 1)
            query = "SELECT * FROM Laptops ORDER BY Price ASC";
        if (Menu1_3On == 1)
            query = "SELECT * FROM Smartphones ORDER BY Price ASC";
        if (Menu1_4On == 1)
            query = "SELECT * FROM Tablets ORDER BY Price ASC";
    }
    SqlCommand command = new SqlCommand(query, myConnection);
    SqlDataReader reader = command.ExecuteReader();
    GetData(reader);
    myConnection.Close();
    reader.Dispose();
}  

Как составить правильно запрос, чтобы я мог выводить в отсортированном виде не только ВСЕ записи в таблице по заданному столбцу и методу сортировки, но и сортировать записи, которые мне выдала база ПОСЛЕ ПОИСКА?

Сейчас работает так: загружается форма и выполняется запрос к базе на показ ВСЕХ записей таблицы. Далее я ввожу в текстовое поля буквы для поиска - база выдает результат, а вот когда я нажимаю кнопку сортировки мне база выдает ВСЕ записи в таблице. Мне же нужно вывести только записи после поиска в отсортированном виде.

Answer 1

Кэшируйте ваш найденный пул записей. Используя List<T> либо другую перечислимую коллекцию. Кэш будет обновляться каждый раз, когда Вы будете делать запрос к БД. Когда нужно отсортировать, то используйте уже не БД, а ваш кэш. Пример работы сортировки в случае List<T> и LINQ:

List<MyDBEntry> list;// кэш
list=GetDataByFilter(); //запись в кэш данных из БД по фильтру
var sortedList = list.OrderBy(x=>x.Price).ToList(); // сортировка с использованием ранее созданного кэша

UPD:

Чтобы избежать создания перегруженного класса-обертки MyDBEntry, можно работать с типом dynamic. Если стоит цель сортировать только по одному полю, и вы уверены, что оно есть во всех записях БД, то для сортировки можно использовать следующий метод, подавая на вход List<dynamic>. При этом кэш будет выглядеть как List<dynamic>. Предварительно ваши записи из БД нужно скастовать к dynamic:

MyList = GetDataByFilter().Cast<dynamic>().ToList();
public List<dynamic> Sort(List<dynamic> input, string property)
{   
    return input.OrderBy(p => p.GetType()
                               .GetProperty(property)
                               .GetValue(p, null)).ToList();
}
READ ALSO
Resharper в проекте asp.net core 2 добавляет View в папку Pages

Resharper в проекте asp.net core 2 добавляет View в папку Pages

Внимание! Это перевод вопроса ASPNET Core 2 - ReSharper “Create Razor View” adds new view to Pages folder

292
Подключение общего проекта TFS в другие проекты

Подключение общего проекта TFS в другие проекты

У меня есть 3 проекта в TFS, один это Web Application, второй DLL, третий это Console Application

210
Перерисовка элемента

Перерисовка элемента

Существует проблема обновления элемента на панели типа VariableSizedWrapGridПри добавлении на панель кнопки методом Childer

243