В моем приложении я искал странную ошибку. Он поступает по уровням или сообщениям об ошибках:Linq 2 Sql - Уже открыт datareader Выпуск
- Имеются уже и открыты данные, связанные с данными. Затем приходит
- Неверная попытка вызова Чтение, когда читатель закрыт. Далее
- Индекс находился за пределами массива. Затем наступает
- Указанный приказ недействителен.
Позвольте мне сначала объяснить, что делает мой код: Я использую шаблон репозитория для своего приложения Linq-Sql. Из этого хранилища звоню этот метод
internal static IEnumerable<ParentChild> GetAllCategoriesAndSubcategories()
{
lock (Context) // lock is implemented just before asking question, to check whether it can solve the issue or not...
{
return from p in Context.Categories
let relatedchilds = (from c in Context.SubCategories
where c.CategoryId == p.Id
select c).Take(5)
select new ParentChild
{
Parent = p,
Childs = relatedchilds
};
}
}
Этот метод выбора строк из двух таблиц, Родитель и ребенок, и возвращает результат в виде новой коллекции класса
public class ParentChild
{
public Category Parent { get; set; }
public IEnumerable<SubCategory> Childs { get; set; }
}
Иногда он работает отлично но когда увеличение трафика и параллелизм, тогда в этом случае я начну получать эти ошибки. Исходя из этого вопроса, из пользовательского интерфейса я потребляю IEnumerable<ParentChild> GetAllCategoriesAndSubcategories()
, чтобы отобразить его в иерархии.
В пользовательском интерфейсе я использую этот метод для визуализации текста:
/// <summary>
/// Write categories Jquery html to the Category usercontrol
/// </summary>
private void WriteCategories()
{
// retrieves all categories and its subcategories as a generic list of ParentChild
var dt = CategoryRepository.GetAllCategoriesAndSubcategories();
//Conversion of dynamic jquery html string starts here
var sb = new StringBuilder();
sb.AppendLine(" <div class='widget_box' id='category'>");
sb.AppendLine(" <div class='wintitle'>");
sb.AppendLine(" <div class='inner_wintitle'>Categories</div>");
sb.AppendLine(" </div>");
sb.AppendLine(" <div class='winbody'>");
sb.AppendLine(" <ul class='categories'>");
var i = 1;
foreach (ParentChild item in dt) //<--* BUGGY PART*
{
sb.AppendLine(
string.Format("<li class='catetitle' id='catetitle{0}'><a href='subcategory.aspx?cid={1}&cname={2}'>{2}</a></li>", i,
item.Parent.Id, item.Parent.Name));
sb.AppendLine(
string.Format("<li style='display:none;' class='category_sub' id='subcategory{0}' ><div><ul>", i));
foreach (var subCategory in item.Childs)
{
sb.AppendLine(string.Format("<li><a href='subcategory.aspx?cid={0}&cname={1}&scid={2}&scname={3}'>{3}</a></li>", item.Parent.Id,
item.Parent.Name, subCategory.Id, subCategory.Name));
}
sb.AppendLine(
string.Format(
"<li class='catetitle' id='catetitle{0}'><a href='subcategory.aspx?cid={1}&cname={2}'>View all categories</a></li>",
i, item.Parent.Id, item.Parent.Name));
sb.AppendLine("</ul></div></li>");
i++;
}
sb.AppendLine("</div></ul></div>");
//Conversion of dynamic jquery html string ends here
// javascript function to display the subcategories when mouse is hovered to the category
sb.AppendLine("<script type='text/javascript'>init_categories();</script>");
ucCategories1.CategoryHtml = sb.ToString(); // Generated text is finally set to the usercontrols property.
}
Я получаю ошибку @foreach (ParentChild item in dt)
. Пожалуйста, помогите мне.
Предложение Требуется: Я использую это как мой реализации шаблона репо:
internal sealed class LeadsRepository : IRepository<BuySell>
{
private static readonly BusinessBazaarDataContext Context;
static LeadsRepository()
{
Context = new BusinessBazaarDataContext();
}
}
не считает это хороший способ использовать DataContext. Пожалуйста, предложите мне ... Спасибо
Я передал 'DataContext' в' LeadsRepository' через инсталляцию конструктора. [Мне не нравится статика.] (Https://sites.google.com/site/steveyegge2/singleton-considered-stupid). Вы можете использовать инфраструктуру инверсии управления (IoC) (например, Ninject, StructureMap, Windsor Castle) для решения проблем, связанных с жизнью. –