Ooof. Это может оказаться довольно неприятным и, вероятно, медленным SQL. Прочитайте https://use-the-index-luke.com/sql/where-clause/obfuscation/smart-logic (не тот блог, на который я хотел бы сослаться - но я не могу найти тот, о котором я думаю, он выглядел гораздо более старым, как когда-то a us enet post)
Запросы в LINQ являются кумулятивными, и они запускаются только тогда, когда что-то перечисляет результат, например, вызывает ToArray для него или ForEach
его. Это означает, что вы можете построить свой запрос динамически за несколько шагов. (Я немного озвучил некоторые вещи для ясности / чтобы проиллюстрировать точку здесь; я не использовал ваши настоящие имена столбцов):
Dim q as IEnumerable(Of Customer) = db.Customers
If nameTextBox.Text <> "" Then q = q.Where(Function(x) x.Name = nameTextBox.Text)
If ageTextBox.Text <> "" Then q = q.Where(Function(x) x.Age = ageTextBox.Text)
If jobTextBox.Text <> "" Then q = q.Where(Function(x) x.Age = jobTextBox.Text)
If sortByCombo.SelectedValue = "Name" Then q = q.OrderBy(Function(x) x.Name)
Else If ....
Если вы только что-то положили в поле Name
, q
имеет один Where
, вызванный на него. Если вы поместите что-то во все 3 поля, Where
будут кумулятивными и будут действовать как единое целое с условиями ANDed в SQL. Запрос БД не выполняется ни в одном из пунктов выше, даже если вы добавили OrderBy. Если вы хотите больше информации об этом, посмотрите «LINQ отложенное выполнение». В тот момент, когда вы попытаетесь прочитать результат, запрос будет запущен.
пс; Я не уверен, что БД будет выполнять упорядочение, требуя повторного запроса при каждом изменении порядка - возможно, просто загрузите результаты в элемент управления, который знает, как сортировать (большинство элементов управления сеткой, windows и веб знать, как кэшировать и сортировать свои данные, чтобы избежать передачи туда и обратно, или использовать контейнер на стороне клиента, который может обрабатывать сортировку, например, DataTable, SortedList et c