我有两张桌子:
我想填充一个ASP.NET服务器控件下拉列表,其中包含已分配书籍的所有作者,并且还将每个作者的项目数附加到列表中。
我已成功完成。然而,只有这一个它很慢,我计划添加3或4个下拉列表做同样的事情。有没有更好的方法来改革以下代码?
using (myDataContext db = new myDataContext())
{
//ddlAuthors
var authors = db.Authors.OrderBy(x=> x.text).Select(x => new
{
authorText= x.text,
authorId = x.authorID,
authorCnt = x.ItemAuthors.Count()
});
ddlAuthor.DataSource = authors;
ddlAuthor.DataTextField = "authorText";
ddlAuthor.DataValueField = "authorId";
ddlAuthor.DataBind();
foreach (ListItem item in ddlAuthor.Items)
{
foreach (var n in authors)
{
if(item.Value == n.authorId.ToString())
item.Text += string.Format(" ({0})", n.authorCnt);
}
}
}
答案 0 :(得分:1)
此代码可能是问题的一部分。
foreach (ListItem item in ddlAuthor.Items)
{
foreach (var n in authors)
{
if(item.Value == n.authorId.ToString())
item.Text += string.Format(" ({0})", n.authorCnt);
}
}
如果ddlAuthor有10个项目,你将经历这个循环100次(外循环中ddlAuthor.Items中每个项目1次,内循环中每个作者1次)。
如果您在查询中做了以下事情:
var authors = db.Authors.OrderBy(x=> x.text).Select(x => new
{
authorText= string.Format("{0} ({1})", x.text, x.ItemAuthors.Count()),
authorId = x.authorID
});
然后它在查询中绑定,您不必循环遍历每个项目并附加计数。
我在LinqPad中尝试了类似的东西,并将结果格式化为我想要的。