Я не уверен, будет ли он выполняться быстрее как один запрос или нет, так как запрос несколько сложен, поэтому я думаю, что это может зависеть от времени запроса на стороне сервера в зависимости от настройки запроса и времени передачи данных.
Вы можете преобразовать в один запрос, который собирает все ответы сразу, а затем разбить этот ответ для каждой переменной.
Этот первый ответ принимает результат и преобразуется в двойное вложенное значение Dictionary
для значений, а затем извлекает переменные из Dictionary
:
var ansd = (from l in MyTable
where new[] { "dcc", "ddc", "mc" }.Contains(l.Name) && new[] { "Main", "DB" }.Contains(l.Service)
group l by new { l.Name, l.Service } into ag
select new {
ag.Key.Name,
ag.Key.Service,
Value = ag.OrderByDescending(l => l.Time).First().Value
})
.GroupBy(nsv => nsv.Name)
.ToDictionary(nsvg => nsvg.Key, nsvg => nsvg.ToDictionary(nsv => nsv.Service, arv => arv.Value));
long? cSRez = null, cDRez = null, dSRez = null, dDRez = null, mSRez = null, mDRez = null;
if (ansd.TryGetValue("dcc", out var td)) td.TryGetValue("Main", out cSRez);
if (ansd.TryGetValue("dcc", out td)) td.TryGetValue("DB", out cDRez);
if (ansd.TryGetValue("ddc", out td)) td.TryGetValue("Main", out dSRez);
if (ansd.TryGetValue("ddc", out td)) td.TryGetValue("DB", out dDRez);
if (ansd.TryGetValue("mc", out td)) td.TryGetValue("Main", out mSRez);
if (ansd.TryGetValue("mc", out td)) td.TryGetValue("DB", out mDRez);
Учитывая, что ответов всего шесть, создание Dictionary
для них может оказаться излишним. Вместо этого вы можете просто (последовательно) найти соответствующие ответы:
var ansl = (from l in MyTable
where new[] { "dcc", "ddc", "mc" }.Contains(l.Name) && new[] { "Main", "DB" }.Contains(l.Service)
group l by new { l.Name, l.Service } into ag
select new {
ag.Key.Name,
ag.Key.Service,
Value = ag.OrderByDescending(l => l.Time).First().Value
})
.ToList();
var cSRez = ansl.FirstOrDefault(ansv => ansv.Name == "dcc" && ansv.Service == "Main");
var cDRez = ansl.FirstOrDefault(ansv => ansv.Name == "dcc" && ansv.Service == "DB");
var dSRez = ansl.FirstOrDefault(ansv => ansv.Name == "ddc" && ansv.Service == "Main");
var dDRez = ansl.FirstOrDefault(ansv => ansv.Name == "ddc" && ansv.Service == "DB");
var mSRez = ansl.FirstOrDefault(ansv => ansv.Name == "mc" && ansv.Service == "Main");
var mDRez = ansl.FirstOrDefault(ansv => ansv.Name == "mc" && ansv.Service == "DB");