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