C# 如何为combobox只获取一次数据源?

C# 如何为combobox只获取一次数据源?,c#,asp.net,performance,web-services,telerik,C#,Asp.net,Performance,Web Services,Telerik,我使用telerik:RadComboBox 像这样: <telerik:RadComboBox runat="server" ID="RadComboBox1" EnableLoadOnDemand="true" ShowMoreResultsBox="true" EnableVirtualScrolling="true" CollapseDelay="0" Culture="ar-EG" Expa

我使用
telerik:RadComboBox

像这样:

<telerik:RadComboBox runat="server" ID="RadComboBox1"  EnableLoadOnDemand="true"
                                            ShowMoreResultsBox="true" EnableVirtualScrolling="true" CollapseDelay="0" Culture="ar-EG" ExpandDelay="0" Filter="StartsWith" ItemsPerRequest="100"
                                            MarkFirstMatch="true" Skin="Outlook" ValidationGroup="L" Width="202px" EnableAutomaticLoadOnDemand="True"
                                            EmptyMessage="-Enter user name-"
                                            EnableItemCaching="true" >
                                            <WebServiceSettings Path="../WebService/Employees.asmx" Method="LoadData" />


和我的web服务:

 [System.Web.Script.Services.ScriptService]
    public class Employees : System.Web.Services.WebService
    {

        [WebMethod(EnableSession = true)]  
            public RadComboBoxData LoadData(RadComboBoxContext context)
                {

                RadComboBoxData result = new RadComboBoxData();
                DataTable dt = FollowsDAL.GetAllEmployees();

                var allEmployees = from r in dt.AsEnumerable()

                                   orderby r.Field<string>("name")

                                   select new RadComboBoxItemData
                                   {
                                       Text = r.Field<string>("name").ToString().TrimEnd()
                                   };
                string text = context.Text;
                if (!String.IsNullOrEmpty(text))
                {
                    allEmployees = allEmployees.Where(item => item.Text.StartsWith(text));
                }
                //Perform the paging
                // - first skip the amount of items already populated
                // - take the next 10 items
                int numberOfItems = context.NumberOfItems;
                var employees = allEmployees.Skip(numberOfItems).Take(100);


                result.Items = employees.ToArray();


                int endOffset = numberOfItems + employees.Count();
                int totalCount = allEmployees.Count();

                //Check if all items are populated (this is the last page)
                if (endOffset == totalCount)
                    result.EndOfItems = true;

                //Initialize the status message
                result.Message = String.Format("Items <b>1</b>-<b>{0}</b> out of <b>{1}</b>",
                                               endOffset, totalCount);

                return result;
            }}
[System.Web.Script.Services.ScriptService]
公共类员工:System.Web.Services.WebService
{
[WebMethod(EnableSession=true)]
公共RadComboxData加载数据(RadComboxContext上下文)
{
RadComboxData结果=新的RadComboxData();
DataTable dt=FollowsDAL.GetAllEmployees();
var allEmployees=从dt中的r开始。可计算()
orderby r.字段(“名称”)
选择新建RadComboxItemData
{
Text=r.Field(“name”).ToString().TrimEnd()
};
string text=context.text;
如果(!String.IsNullOrEmpty(text))
{
allEmployees=allEmployees.Where(item=>item.Text.StartsWith(Text));
}
//执行分页
//-首先跳过已填充的项目数量
//-接下来的10项
int numberOfItems=context.numberOfItems;
var employees=allEmployees.Skip(numberOfItems).Take(100);
result.Items=employees.ToArray();
int endOffset=numberOfItems+employees.Count();
int totalCount=allEmployees.Count();
//检查是否已填充所有项目(这是最后一页)
if(endOffset==totalCount)
result.EndOfItems=真;
//初始化状态消息
result.Message=String.Format({1}中的项目1-{0}),
内偏移、总计数);
返回结果;
}}

我的问题是:

尽管此控件速度很快,但每次我首先输入特定名称时,它都会在数据表
dt
中获取
20000
员工

每一个角色

我的问题是:

  • 这种不良行为有多快
  • 有没有办法让所有的员工只工作一次
  • 如何提高绩效

使用服务器端过滤总是更好的,因为您不需要将20000条记录检索到Web服务器,就可以使用10或20条记录返回


使用服务器端过滤总是更好的,因为您不需要将20000条记录检索到Web服务器,就可以使用10或20条记录返回


我将创建一个方法,从数据库中加载值,然后将它们存储在缓存中。对该方法的后续调用应返回缓存版本。然后将数据源设置为此方法。这将给您带来非常好的性能提升


我将创建一个方法,从数据库中加载值,然后将它们存储在缓存中。对该方法的后续调用应返回缓存版本。然后将数据源设置为此方法。这将给您带来非常好的性能提升


您的DAL应该有一个基于发送的文本过滤结果的方法,然后将它们添加到组合框中。我的DAL是Telerik OpenAccess ORM(Linq2SQL),但您也可以编写一个存储过程来过滤结果

下面是我的asmx服务之一填充radcombobox的示例:

    [WebMethod]
    public RadComboBoxData FindEmployee(RadComboBoxContext context)
    {
        RadComboBoxData comboData = new RadComboBoxData();

        using (DataBaseContext dbc = new DataBaseContext())
        {
            IQueryable<Employee> Employees = dbc.FindEmployee(context.Text);

            int itemOffset = context.NumberOfItems;
            int endOffset = Math.Min(itemOffset + 10, Employees.Count());
            List<RadComboBoxItemData> result = new List<RadComboBoxItemData>();

            var AddingEmployees = Employees.Skip(itemOffset).Take(endOffset - itemOffset);
            foreach (var Employee in AddingEmployees)
            {
                RadComboBoxItemData itemData = new RadComboBoxItemData();
                itemData.Text = Employee.Person.FullName;
                itemData.Value = Employee.EmployeeID.ToString();

                result.Add(itemData);
            }


            comboData.EndOfItems = endOffset == Employees.Count();
            comboData.Items = result.ToArray();
            if (Employees.Count() <= 0)
                comboData.Message = "No matches";
            else
                comboData.Message = String.Format("Items <b>1</b>-<b>{0}</b> out of <b>{1}</b>", endOffset, Employees.Count());
            return comboData;
        }
    }
[WebMethod]
公共RadComboxData FindEmployee(RadComboxContext上下文)
{
RadComboxData ComboxData=新的RadComboxData();
使用(DataBaseContext dbc=newdatabasecontext())
{
IQueryable Employees=dbc.findeEmployee(context.Text);
int itemOffset=context.NumberOfItems;
int endOffset=Math.Min(itemOffset+10,Employees.Count());
列表结果=新列表();
var AddingEmployees=Employees.Skip(itemOffset).Take(endOffset-itemOffset);
foreach(var员工和其他员工)
{
RadComboBoxItemData itemData=新的RadComboxItemData();
itemData.Text=Employee.Person.FullName;
itemData.Value=Employee.EmployeeID.ToString();
结果。添加(itemData);
}
comboData.EndOfItems=endOffset==Employees.Count();
comboData.Items=result.ToArray();

如果(Employees.Count()您的DAL应该有一个根据发送的文本过滤结果的方法,那么您可以将它们添加到组合框中。我的DAL是Telerik OpenAccess ORM(Linq2SQL),但您也可以编写一个存储过程来过滤结果

下面是我的asmx服务之一填充radcombobox的示例:

    [WebMethod]
    public RadComboBoxData FindEmployee(RadComboBoxContext context)
    {
        RadComboBoxData comboData = new RadComboBoxData();

        using (DataBaseContext dbc = new DataBaseContext())
        {
            IQueryable<Employee> Employees = dbc.FindEmployee(context.Text);

            int itemOffset = context.NumberOfItems;
            int endOffset = Math.Min(itemOffset + 10, Employees.Count());
            List<RadComboBoxItemData> result = new List<RadComboBoxItemData>();

            var AddingEmployees = Employees.Skip(itemOffset).Take(endOffset - itemOffset);
            foreach (var Employee in AddingEmployees)
            {
                RadComboBoxItemData itemData = new RadComboBoxItemData();
                itemData.Text = Employee.Person.FullName;
                itemData.Value = Employee.EmployeeID.ToString();

                result.Add(itemData);
            }


            comboData.EndOfItems = endOffset == Employees.Count();
            comboData.Items = result.ToArray();
            if (Employees.Count() <= 0)
                comboData.Message = "No matches";
            else
                comboData.Message = String.Format("Items <b>1</b>-<b>{0}</b> out of <b>{1}</b>", endOffset, Employees.Count());
            return comboData;
        }
    }
[WebMethod]
公共RadComboxData FindEmployee(RadComboxContext上下文)
{
RadComboxData ComboxData=新的RadComboxData();
使用(DataBaseContext dbc=newdatabasecontext())
{
IQueryable Employees=dbc.findeEmployee(context.Text);
int itemOffset=context.NumberOfItems;
int endOffset=Math.Min(itemOffset+10,Employees.Count());
列表结果=新列表();
var AddingEmployees=Employees.Skip(itemOffset).Take(endOffset-itemOffset);
foreach(var员工和其他员工)
{
RadComboBoxItemData itemData=新的RadComboxItemData();
itemData.Text=Employee.Person.FullName;
itemData.Value=Employee.EmployeeID.ToString();
结果。添加(itemData);
}
comboData.EndOfItems=endOffset==Employees.Count();
comboData.Items=result.ToArray();
如果(Employees.Count()我认为你的sol
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 or your string variable")
Create Proc ProcName
As

Create Table #Temp
(
    ColumnName Varchar(50)
)

Insert into #Temp(ColumnName)
Select ColumnName from YourTableName

Select ColumnName From #Temp Where ColumnName like 'a%'
Select ColumnName From #Temp Where ColumnName like 'b%'
Select ColumnName From #Temp Where ColumnName like 'c%'
--UpTo Z
public static class GetFilteredData
{
    public static DataTable FilterDataTable(this DataSet Dt, string FilterExpression)
    {
        string Lowercase = FilterExpression.ToLower();
        Int16 TableID = 0;
        if (Lowercase.StartsWith("a"))
        {
            TableID = 0;
        }
        else if (Lowercase.StartsWith("b"))
        {
            TableID = 1;
        }
        else if (Lowercase.StartsWith("c"))
        {
            TableID = 2;
        }
        //upTo Z
        using (DataView Dv = new DataView(Dt.Tables[TableID]))
        {
            Dv.RowFilter = FilterExpression;
            return Dv.ToTable();
        }
    }
}
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();
        }
    }
}
public DataTable Employees
{
    get
    {
        if (ViewState["Employees"] == null)
        {
            return FollowsDAL.GetAllEmployees();
        }
        return (DataTable)ViewState["Employees"];
    }
    set
    {
        ViewState["Employees"] = value;
    }
}