Чтобы получить всю информацию об агенте, а затем присоединиться к нему, чтобы получить счетчики из другой таблицы, вам, как правило, нужно сделать группу по всем неагрегированным полям ... Если в вашей таблице агентов есть несколько полей, вы было бы лучше предварительно агрегировать ваш подзапрос, чтобы просто получать счетчики для каждого агента-агента ... Тогда у вас есть НАИБОЛЕЕ по одной записи на агента и вы можете просто выполнить LEFT-JOIN для этого агента.
Я предполагаю, что ссылки на ваши таблицы "table", "table2", "table3" на самом деле являются поддельными именами реальных таблиц, но в запросе используются псевдонимы "agent", "p" и "q" соответственно.
select
agent.*,
que.AgentQueueCount queue_count
from
table agent
left join
(select
q.agent_id,
count(*) AgentQueueCount
from
table2 q
INNER JOIN table3 p
on q.path_id = p.id
AND p.name='demo'
where
q.status = 1
group by
q.agent_id ) que
on agent.id = que.agent_id
order by
que.AgentQueueCount
Здесь подзапрос уже внутренне объединен по совпадающему идентификатору пути и имени пути.
Необходимо быть ясными в уме о различии между объектом и переменной. Сами объекты не имеют имен. Имена переменной решены во время компиляции. Вы не можете переменные доступа через определенное временем выполнения имя кроме через отражение.
Это кажется, что Вы действительно просто хотите a Dictionary<string, CustomObj>
:
Dictionary<string, CustomObj> map = new Dictionary<string, CustomObj>();
foreach (string name in stringArray)
{
map[name] = new CustomObj(name);
}
Можно затем получить доступ к объектам с помощью индексатора для словаря.
Если Вы действительно пытаетесь установить значения переменных на основе их имени во время выполнения, необходимо будет использовать отражение (см. Тип. GetField). Обратите внимание, что это не будет работать на локальные переменные.
Вы не можете.
Можно разместить их в словарь:
Dictionary<String, CustomObj> objs = new Dictionary<String, CustomObj>();
foreach (string i in stringarray)
{
objs[i] = new CustomObj(i);
}
Но это почти так хорошо, как это добирается.
Если Вы храните объекты в полях в Вашем классе, как это:
public class SomeClass
{
private CustomObj fooObj;
private CustomObj barObj;
private CustomObj bazObj;
}
Затем можно достигнуть их посредством отражения. Сообщите мне, является ли это маршрутом, Вы хотите взять.
Другая опция, менее гибкая, но более простая, через Активатор. CreateInstance - где Вы просите новый объект быть созданными - он не присвоит динамическим переменным, но это необходимо?
Одна опция является полностью динамическим маршрутом согласно этой статье, где Вы указываете блок кода в строке и затем компилируете/выполняете его из Вашей программы
Это - возможное отражение использования, если переменные являются членскими переменными класса, но это ужасно медленно для чего-то большего чем очень специализированных приложений. Я думаю, детализируете ли Вы то, что Вы пытаетесь сделать, мы можем лучше предложить предложения. Существует очень редко случай, где необходимо получить доступ к переменной как, Вы делаете.
вы можете использовать функцию поиска:
public static Control FindControl(string controlId, Control container)
{
if (container.ID == controlId)
return container;
foreach (Control control in container.Controls)
{
Control c = FindControl(controlId, control);
if (c != null)
return c;
}
return null;
}
и тогда вы получите свой контроль на основе по индексу вроде этого: TextBox firstname = (TextBox) FindControl (string.Concat ("TextBox", index.ToString ()), это); Надеюсь, это поможет.
@jotte: Большое спасибо за эту функцию. Я использовал его, и он работает! За исключением того, что вам нужно изменить container.ID на container.Name
Тогда вам просто нужно использовать что-то вроде (этот пример для флажка, но любой тип переменной может работать):
string Test = "cbACn" + i.ToString (); CheckBox cbTest = (CheckBox) FindControl (Test, gbACSCAT); if (cbTest! = null) { cbTest.Checked = true; }