Это то, над чем я работаю, чтобы вернуться в мир веб-разработчиков
ASP.Net с VS2008
Дозвуковой как уровень доступа к данным
БД SqlServer
Главная Описание проекта: У меня есть система регистрации студентов. У меня есть веб-страница, на которой должны отображаться записи об учениках.
В настоящее время у меня есть элемент управления gridview, который показывает записи
Пользователь входит в систему и попадает на страницу просмотра студентов. В сетке отображаются учащиеся в системе, где в одном из столбцов отображается статус регистрации: открыт, ожидает, завершен.
Я хочу, чтобы пользователь мог применять динамическую сортировку или фильтры к возвращаемому результату, чтобы получить более точный результат, который они хотят видеть. Я предполагал, что пользователь сможет фильтровать результаты, применяя предложение where или подобное предложение к возвращаемому результату через интерфейс набора данных с помощью дозвукового метода. Я не хочу снова запрашивать базу данных, чтобы применить фильтр
пример: начальный запрос
Select * from studentrecords where date = convert(varchar(32,getdate(),101)
Затем пользователь должен иметь возможность применить фильтр к возвращаемому набору результатов, чтобы он мог использовать фамилию, например "% Souza%".
Возможно ли это вообще, и является ли привязка источника данных к элементу управления gridview лучшим подходом, или я должен создать настраиваемую коллекцию, унаследованную от базы коллекции, а затем привязать ее к элементу управления gridview?
PS: Извините за опечатку. Моя машина находится под воздействием разлива чая на ноутбук





Я использую LINQ-to-SQL, а не Subsonic, поэтому YMMV, но мой подход к фильтрации заключался в предоставлении обработчика OnSelecting источнику данных. В LINQ-to-SQL я могу заменить результат ссылкой на метод DataContext, который возвращает результат применения возвращающей табличное значение функции. Возможно, вы захотите исследовать нечто подобное с Subsonic.
Как сказал Тванфоссон, LINQ очень хорошо подходит для создания составных запросов; вы можете сделать это либо с полностью дунамическим TSQL, который генерирует базовая библиотека, либо с помощью UDF, который вы помечаете с помощью [FunctionAttribute (..., IsComposable = true)] в контексте данных.
Я не знаком с Subsonic, поэтому не могу давать там советы; но еще одна мысль: в вашем коде "date =" вы можете рассмотреть возможность объявления переменной datetime и ее назначения в первую очередь ... таким образом оптимизатор обычно лучше справляется с ее оптимизацией (запрос проще, и нет вопрос, преобразует ли он datetime (для каждой строки) в varchar или varchar в datetime). Самый эффективный способ получить только часть даты - это cast / floor / cast:
SET @today = GETDATE()
SET @today = CAST(FLOOR(CAST(@today as float)) as datetime)
[обновить комментарий]
Возможность повторной компоновки - я имею в виду, что это позволяет вам создать такой запрос, чтобы в базе данных выполнялся только запрос окончательный. Например:
var query = from row in ctx.SomeComplexUdf(someArg)
where row.IsOpen && row.Value > 0
select row;
может выйти из строя сервер через TSQL:
SELECT u1.*
FROM dbo.SomeComplexUdf(@p1) u1
WHERE u1.IsOpen = 1 -- might end up parameterized
AND u1.Value > 0 -- might end up parameterized
Дело в том, что с сервера возвращаются только подходящие данные, а не много данных, которые возвращаются, а затем выбрасываются. LINQ-to-SQL может делать все, что угодно, с помощью компилируемых запросов, включая разбиение на страницы, сортировку и т. д. Минимизируя объем данных, загружаемых из базы данных, вы можете значительно улучшить производительность.
Альтернатива без возможности компоновки состоит в том, что она просто выполняет:
SELECT u1.*
FROM dbo.SomeComplexUdf(@p1) u1
А затем отбрасывает другие строки в вашем веб-приложении ... очевидно, если вы ожидаете 20 открытых записей и 10000 закрытых записей, это огромная разница.
MG: когда вы говорите составные запросы, требуется ли для этого повторный запрос к базе данных или это работает с результатом, возвращенным во время первоначального запроса?
Как насчет этого?
Вместо того, чтобы назначать источник данных / таблицу вашему элементу управления сеткой, вместо этого прикрепите к нему DataView.
Вот пример псевдокода:
DataTable myDataTable = GetDataTableFromSomewhere();
DataGridView dgv = new DataGridView();
DataView dv = new DataView(myDataTable);
//Then you can specify things like:
dv.Sort = "StudentStatus DESC";
dv.Filter = "StudentName LIKE '" + searchName + '";
dgv.DataSource = dv;
...и так далее.
Хотите ли вы искать только в одном поле (фамилии) или хотите разрешить пользователям выбирать поле, в котором они хотят искать и сортировать? Всегда плохой способ брать все записи и сортировку без обращения к базе данных, так как последние обновления не будут видны, если вы делаете это.