Источник данных SQL для gridview - PullRequest
0 голосов
/ 14 апреля 2010

Я хочу использовать gridView с сортировкой и подкачкой для отображения данных с SQL-сервера, в запросе используется 3 объединения, а в таблице содержится полнотекстовый поиск. Часть запроса from использует все 3 таблицы в соединении.

Каков наилучший способ сделать это? Я могу думать о хранимой процедуре, SQL непосредственно в SQLDataSource и создании представления в базе данных. Я хочу хорошей производительности и хотел бы максимально использовать возможности автоматической сортировки и разбивки на страницы в виде сетки.

Edit: Что касается размера, я подозреваю, что очень мало записей, всего около 1000, и запрос, как правило, приводит не более чем к 100 записям, а в большинстве случаев гораздо меньше.

Ответы [ 4 ]

1 голос
/ 15 апреля 2010

Вот что я в итоге сделал

.aspx
<asp:GridView ID="gridAnnoncer" runat="server" AutoGenerateColumns="false" DataSourceID="dsAnnonceSearch" DataKeyNames="Id" AllowPaging="true" AllowSorting="true" PageSize="1">
    <Columns>
        ..
    </Columns>
</asp:GridView>

<asp:LinqDataSource ID="dsAnnonceSearch" runat="server" AutoPage="false" OnSelecting="AnnonceSearchOnSelecting">
</asp:LinqDataSource>


.aspx.cs
protected void AnnonceSearchOnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
    using (TheContext context = new TheContext())
    {
        int? totalRows;
        string orderby = e.Arguments.SortExpression.ToLower().Replace(" desc", "").Replace(" asc", "").Trim();
        string sortDirection = e.Arguments.SortExpression.ToLower().Contains("desc") ? "desc" : "asc";
        e.Result = context.AnnonceSearch("test", orderby, sortDirection, e.Arguments.StartRowIndex, e.Arguments.MaximumRows, out totalRows);
        e.Arguments.TotalRowCount = (int) totalRows;
    }
}


Stored procedure
ALTER PROCEDURE [dbo].[AnnonceSearch]
    @keywords nvarchar(4000),
    @orderby varchar(100),
    @orderDirection varchar(100),
    @startRowIndex int,
    @maximumRows int,
    @totalRows int output
AS
BEGIN
    SET NOCOUNT ON;

    if @keywords is null or @keywords = '' set @keywords = '""'
    if @startRowIndex < 0 RAISERROR('startRowIndex parameter is invalid', 0, 1)
    if @maximumRows < 1 RAISERROR('getRows parameter is invalid', 0, 1)

    select TOP (@maximumRows) Id, Productname, description, Zipcode from
        (select row_number() over (order by 
            case when lower(@orderDirection) = 'desc' then
                    case lower(@orderby)
                        when 'description' then Annoncer.description
                        when 'Productname' then Annoncer.Productname
                    end
            end desc,
            case when lower(@orderDirection) = 'asc' then
                    case lower(@orderby)
                        when 'description' then Annoncer.description
                        when 'Productname' then Annoncer.Productname
                    end
            end
            ) as RowNumber, 
        Annoncer.Id, Annoncer.Productname, Annoncer.description from Annoncer

        where @keywords = '""' or (contains(Annoncer.Productname, @keywords) or 
                                    contains(Annoncer.description, @keywords))) searchResult
    where RowNumber > @startRowIndex

    SELECT @totalRows = COUNT(*) FROM Annoncer
END
1 голос
/ 14 апреля 2010

Все зависит от объема данных, о которых вы говорите.Если в нем миллионы записей, я бы не рекомендовал автоматическую сортировку и разбиение на страницы.Лучше использовать хранимую процедуру и использовать функцию Row_Number () (если вы используете SQL 2005).

HTH

1 голос
/ 14 апреля 2010

Мое предложение будет использовать хранимую процедуру. Вы можете настроить ввод параметров хранимой процедуры из источника SQLDataSource, прикрепленного к Gridview. Я бы не рекомендовал использовать в вашем источнике данных оператор прямого выбора SQL, так как IMHO вызов хранимой процедуры со спецификацией параметров более безопасен.

Надеюсь, это поможет, Sid

0 голосов
/ 15 апреля 2010

Я бы создал процедуру поиска с параметрами для всех ваших входных данных и прикрепил бы эти поля ввода к вашему источнику данных Sql. Таким образом, когда пользователи вводят критерии фильтра, все, что вам нужно сделать, это вызвать grid.DataBind (), чтобы применить фильтр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...