Заполните раскрывающийся список и добавьте назначенное количество продуктов к каждому - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть две таблицы:

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 Ответ

1 голос
/ 07 апреля 2011

Этот код может быть частью проблемы.

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 раз (1 раз для каждого элемента в ddlAuthor.Items во внешнем цикле, а затем 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, и он отформатировал результаты, как я хотел.

...