填写下拉列表并将指定的产品计数附加到每个列表

时间:2011-04-07 15:49:56

标签: c# asp.net linq-to-sql

我有两张桌子:

enter image description here

我想填充一个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);
                }
            }
        }

1 个答案:

答案 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中尝试了类似的东西,并将结果格式化为我想要的。