Я пытаюсь создать XML со следующей структурой:C# DbDataReader двойная петля
<ResponseSubschemas>
<organism>LMO</organism>
<Subschema>
<id>MLST</id>
<name>MLST</name>
<loci>
<locus>LMO0558</locus>
<locus>LMO0563</locus>
</loci>
</Subschema>
<Subschema>
<id>MLVST</id>
<name>MLVST</name>
<loci>
<locus>LMO1305</locus>
<locus>LMO1089</locus>
</loci>
</Subschema>
</ResponseSubschemas>
Я имею а.о. две таблицы в моей базе данных:
subschema
с, как колонныID
иName
subschemamembers
с колоннами, какsubschemaID
иlocusID
.
У меня есть следующий C# код:
XElement rootNode = new XElement("ResponseSubschemas", new XElement("organism", organismID));
DbDataReader subschemaReader = conn.Query("SELECT ID, Name FROM subschema WHERE OrganismID = ?", organismDbID);
while (subschemaReader.Read())
{
string subschemaDbID = (string)subschemaReader["ID"];
XElement subschemaNode = new XElement("Subschema",
new XElement("id", subschemaDbID),
new XElement("name", subschemaReader["Name"])
);
rootNode.Add(subschemaNode);
}
responseXml = rootNode.ToString();
который создает следующий частичный XML:
<ResponseSubschemas>
<organism>LMO</organism>
<Subschema>
<id>MLST</id>
<name>MLST</name>
</Subschema>
<Subschema>
<id>MLVST</id>
<name>MLVST</name>
</Subschema>
</ResponseSubschemas>
Теперь мне нужно добавить для каждого Subschema
узла в loci
узел, петлю над локусы и добавить их. Я попытался создать новый DbDataReader
внутри цикла while, но затем я получил ошибки, такие как: There is already an open DataReader associated with this Connection which must be closed first
. Итак, как мне это сделать?
Update:
Попытка идти с JOIN
подходом, я обработал следующий SQL:
SELECT subschema.Id, subschema.name as subschemaName, locus.Name as locusName
FROM subschema
LEFT JOIN subschemamembers ON subschemamembers.SubSchemaID = subschema.PrimKey
LEFT JOIN locus ON subschemamembers.LocusID = locus.ID
WHERE subschema.OrganismID = 6
ORDER BY subschema.Id;
который дает следующий результат:
Id subschemaName locusName
MLST MLST LMO0558
MLST MLST LMO0563
MLVST MLVST LMO1305
MLVST MLVST LMO1089
, но я до сих пор не может понять, как я буду отслеживать «указывает ли текущая строка db на другой subschemaDbID».
Вы можете увидеть мое обновление? Заранее спасибо. – BioGeek
На каждой итерации цикла вы читаете все поля. У вас есть переменная за пределами цикла, например string currentSubschemaId, которая хранит идентификатор. В цикле, если currentSubschemaId! = Reader ["Id"], пришло время создать новый XElement («Subschema») (и сохранить читателя [«Id»] в currentSubschemaId). –