我想使用带有排序和分页的gridview来显示来自SQL服务器的数据,该查询使用3个连接并且全文搜索包含stable。查询的from部分使用连接中的所有3个表。
最好的方法是什么?我可以直接在SQLDataSource中考虑存储过程SQL,并在数据库中创建视图。 我希望获得良好的性能,并希望尽可能地利用gridview的自动排序和分页功能。
编辑: 关于大小,我怀疑记录很少,总共大约1000个,查询通常会导致不超过100条记录,而且大多数时候会少得多。
答案 0 :(得分:1)
我的建议是使用存储过程。您可以从附加到Gridview的SQLDataSource设置存储过程参数输入。我不鼓励在数据源中使用直接SQL select语句,因为IMHO调用带参数规范的存储过程更安全。
希望这有帮助, SID
答案 1 :(得分:1)
这完全取决于您所谈论的数据量。如果它有数百万条记录,那么我不会建议自动排序和分页。最好使用存储过程并使用Row_Number()功能(如果您使用的是SQL 2005)。
HTH
答案 2 :(得分:1)
这是我最终做的事情
.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
答案 3 :(得分:0)
我会创建一个包含所有输入参数的搜索过程,并将这些输入字段附加到您的Sql数据源。这样,当用户输入过滤条件时,您只需调用grid.DataBind()来应用过滤器。