7

我在 ASP.Net WebForms 中进行优化。

就我而言,我有 2 个下拉菜单和一个网格。

我希望下拉列表充当网格的过滤器,每个下拉列表在网格的一列中包含不同的数据列表(用作过滤器)

很好..我让它工作了,但我不能再使用与网格相同的数据源作为下拉菜单,因为我正在对数据源应用过滤器表达式来过滤网格中的内容。

由于它与下拉列表相同的数据源,因此我在下拉列表中获得了一个较小的不同列表。

现在我可以使用多个数据源,每个数据源都使用相同的数据对象,但我在 Sql Profiler 中看到进行了 2 个数据调用,但我真的很想使用同一个,这样我就可以进行一个数据调用。

是否甚至可以为网格过滤单个 ObjectDataSource,同时为另一个控件提供未过滤的数据?

4

3 回答 3

4

如果您专注于不必进行多个 SQL 调用,一种选择是使用 LINQDataSet在您的SelectMethod. 在语法上可能有一种更优雅的方法(我想不出来),但这应该使用单个ObjectDataSource.

如果您的ObjectDataSource声明如下所示:

<asp:ObjectDataSource ID="myObjectDataSource" runat="server" SelectMethod="myObjectDataSource_Select" OnFiltering="myObjectDataSource_Filtering">

在您的SelectMethod情况下,您可以执行以下操作:

public DataSet myObjectDataSource_Select()
{
   string sqlQuery = "SELECT col1, col2, col3 FROM foo";
   SqlDataAdapter da = new SqlDataAdapter(sqlQuery, myConnectionString);
   DataSet ds = new DataSet();
   using (da) {
        da.Fill(ds);
   }

   //Perform your secondary filtering here
   object [] unfilteredQuery= (from r in ds.Tables[0].AsEnumerable()
        select r.Field<string>(“col1”)).ToArray();
   myUnfilteredComboBox.Items.Clear();
   myUnfilteredComboBox.Items.AddRange(unfilteredQuery);

   return ds;    
}
于 2012-04-15T05:00:08.707 回答
2

你用的是linq吗?如果是,那应该是可能的:

// Loading complete data into object
var myCompleteDataSource = (from c in ctx select c).ToList();

// Filtering the already loaded data
var myFilteredDataSource = myCompleteDataSource.Where(o=>o.MyField=="abc").ToList(); 

然后只需将数据源设置为您的对象。

这将只从数据库加载一次数据(第.ToList()一种方法),并将对象列表过滤到第二个对象中,而无需再次访问数据库。

于 2012-04-15T04:48:14.237 回答
1

正如您所说,“由于它与下拉列表的数据源相同,因此我在下拉列表中获得了一个较小的不同列表。”

您可以将 保留Database InformationViewState中。这样,您可以阻止 Request to Database您的客户请求。因此Reducing the Access time

例子

public DataTable Employees
{
    get
    {
        if (ViewState["Employees"] == null)
        {
            return FollowsDAL.GetAllEmployees();
        }
        return (DataTable)ViewState["Employees"];
    }
    set
    {
        ViewState["Employees"] = value;
    }
}

如何使ViewState数据过滤快速?

答案是 - 请不要使用Update Panel. 我会用Page Method.

请检查下面的示例。我Update PanelScript Manager. 在此处输入图像描述


输出

在此处输入图像描述

要显示 22 个字符的字符串,您可以检查正在接收和发送到服务器的数据量。想象一下

  1. 如果您考虑使用更新面板将每个请求发送到数据库并且您的 GridView 在Update Panel!!!!!!
  2. 如果您对每个请求使用ViewStateGridView数据并在Update Panel.

根据我的理解,上述两种技术都是最差的。


现在我将向您描述页面方法

更新面板上的页面方法

Page methods允许ASP.NET AJAX页面直接执行 a Page’s Static Methods,使用JSON (JavaScript Object Notation). 代替posting back and then receiving HTML markupto completely replace our UpdatePanel’s contents,我们可以使用 aweb method只请求我们感兴趣的信息。

示例代码

在此处输入图像描述 在此处输入图像描述


输出

在此处输入图像描述


所以结论是我肯定会使用ViewState BUT with Page Methods.

ViewState 数据的过滤技术。

public static class GetFilteredData
{
    public static DataTable FilterDataTable(this DataTable Dt, 
                                                         string FilterExpression)
    {
        using (DataView Dv = new DataView(Dt))
        {
            Dv.RowFilter = FilterExpression;
            return Dv.ToTable();
        }
    }
}

例子

DataTableObject.FilterDataTable("Search Expression")

嗨 vpiTriumph... 我发现代码有所改进。以下是建议的方法。

C Sharp 中的示例代码

private void DsataBaseInteraction()
{
    using (SqlConnection con = new SqlConnection("Your Connection String"))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = con;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "Your Stored Procedure name";
            using (SqlDataReader DR = cmd.ExecuteReader())
            {

            }
        }
    }
}

@KevinDeus - 我假设Database正在使用的是SQL Server. 所以下面提到的是我对Stored Procedurein的建议Database

Create Proc ProcedureName
@UserName Varchar(50),
@Password Varchar(50),
@Email Varchar(50)
As
SET NOCOUNT ON
SET XACT_ABORT ON

Begin Try
    Begin Tran
        Insert into Account (Username,Password, Email)
        Values(@UserName, @Password, @Email)
    Commit Tran 
End Try

Begin Catch
    Rollback Tran
End Catch

参考在这里这里

于 2012-04-20T16:33:28.343 回答