Этот код может быть частью проблемы.
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, и он отформатировал результаты, как я хотел.