Я пытался обновить производительность моего кода в отношении запросов к базе данных. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу найти способ получить новый контекст для каждого подзапроса.
Использование приведенного ниже упрощенного кода приведет к неосторожному генерированию сообщения «Основной поставщик не удалось открыть».
using (var context = getNewContextObject())
{
var result = new SomeResultObject();
var parentQuery = context.SomeTable.Where(x => x.Name = "asdf");
Parallel.Invoke(() =>
{
result.count1 = parentQuery.Where(x => x.Amount >= 100 & x.Amount < 2000).Count();
}, () =>
{
result.count2 = parentQuery.Where(x => x.Amount < 100).Count();
}
, () =>
{
result.count3 = parentQuery.Where(x => x.Amount >= 2000).Count();
}
);
}
Единственный способ обойти это, по-видимому, - перестроить весь запрос для каждого подзапроса с новым контекстом. Есть ли способ избежать построения каждого запроса снизу вверх с новым контекстом? Могу ли я вместо этого просто прикрепить каждый запрос подзапроса к новому контексту? Я ищу что-то вроде ниже.
Parallel.Invoke(() =>
{
var subQuery = parentQuery.Where(x => x.Amount >= 100 & x.Amount < 2000).Count();
subQuery.Context = getNewContextObject();
result.count1 = subQuery.Count();
}, () =>
{
var subQuery = parentQuery.Where(x => x.Amount < 100).Count();
subQuery.Context = getNewContextObject();
result.count2 = subQuery.Count();
}
, () =>
{
var subQuery = parentQuery.Where(x => x.Amount >= 2000).Count();
subQuery.Context = getNewContextObject();
result.count3 = subQuery.Count();
}
);
}