LINQ2OBJECTS: Как получить мои внутренние элементы? - PullRequest
0 голосов
/ 28 марта 2011

У меня есть простой XML-файл, который я преобразовал в XSD с помощью xsd.exe, а затем преобразовал в строго типизированный класс с / C на xsd.exe

<?xml version="1.0" encoding="utf-8" ?>
<MyStruct>
  <Test Name="Test1">
    <Params>
      <Param Name="Param1">I am param1</Param>
      <Param Name="Param2">I am param2</Param>
    </Params>
  </Test>
  <Test Name="Test2">
    <Params>
      <Param Name="Param1">I am param1</Param>
      <Param Name="Param2">I am param2</Param>
    </Params>
  </Test>
</MyStruct>

Теперь я читаю в XML примерно так

 myStruct.ReadXml(file, XmlReadMode.ReadSchema);

Теперь я могу проверить свойства myStruct и увидеть параметры и тест. Отлично!

Теперь, используя простой запрос ссылки, я делаю это

 var tests = from s in myStruct.Test select s;

и, конечно же, я вижу Test1 и Test2. Теперь поймите, тогда внутри Test1 и Test2 есть Params. Я замечаю, что могу сделать

 GetParamsRows();

и тогда я могу сделать foreach поверх него, каждый элемент - ParamsRow. И что такое отдача, я не могу видеть «Я парам1» или «Я парам2»

Мне нужно внутреннее соединение или что-то в этом роде.

Я думал, что при наборе теста внутри есть коллекция или параметры, поэтому я должен быть в состоянии увидеть их.

Я действительно смущен,

Любая помощь действительно ценится

EDIT

Теперь я заметил, что в Test есть test_id, а в Params есть Params_id и Test_id.

Кажется, свойства отношений настроены, но нужно ли мне создавать руководство по JOINS ... любая помощь действительно ценится

TEST

Я заметил свойство с именем Tables, и в нем есть 3 мои таблицы, я предполагаю, что мне нужно сделать соединения для этих .. т.е. от теста к параметру к параметру ... Как база данных?

Любое подтверждение, если я нахожусь на правильных линиях будет с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 28 марта 2011

Может показаться, что вы на самом деле не используете LINQ to XML. В этом случае у вас есть XML-сериализуемый набор классов, сгенерированный XSD.exe, и LINQ to Objects запрашивает эти классы. Сериализуемые классы используют старые классы XML (XmlDocument, XmlElement и т. Д.) Вместо новых (XDocument, XElement и т. Д.).

Если вы заинтересованы в использовании чистого LINQ to XML, рассмотрите следующий учебник, который, я думаю, вы можете быстро адаптировать к вашим потребностям:

http://www.switchonthecode.com/tutorials/introduction-to-linq-simple-xml-parsing


ОБНОВЛЕНИЕ: решение без LINQ-to-XML

Я считаю, что непосредственная проблема, с которой вы сталкиваетесь, заключается в том, что XSD.exe не сделал вывод, что вы предполагали, что элемент <Test> должен содержать не более одного <Params> элемента. Он обрабатывается так, как будто может быть массив из <Params> элементов.

Тип ParamsRow представляет отдельный элемент <Params>; не отдельные <Param> элементы. Я поставил бы красивый камень из сада, что у объекта ParamsRow есть метод GetParamRows() (обратите внимание на единственное число).

Другое обновление

Пример ниже выполняет ту же операцию, что и пример LINQ-to-XML. Он повторяет каждый тест и печатает тест вместе со своими параметрами. Для удобства я использую метод расширения SelectMany(), который "сводит" результаты в единый набор ParamRow объектов.

var myStruct = new MyStruct();
myStruct.ReadXml(@".\MyXml.xml", XmlReadMode.ReadSchema);
foreach (MyStruct.TestRow test in myStruct.Test)
{
    Console.WriteLine("Test #" + test.Name);
    foreach (var param in test.GetParamsRows().SelectMany(ps => ps.GetParamRows()))
    {
        Console.WriteLine("- {0}: {1}", param.Name, param.Param_Text);
    }
}

Проверьте это и дайте мне знать, если это решит.


Следующий пример LINQ to XML перебирает каждый элемент Test и представляет его параметры на консоли. Обратите внимание, что в примере не используются классы, созданные с помощью XSD.exe, и для него не требуется или не используется схема.

var doc = XDocument.Load(@".\MyXml.xml");
foreach (var test in doc.Descendants("Test"))
{
    Console.WriteLine("Test #" + test.Attribute("Name").Value);
    foreach (var param in test.Descendants("Param"))
    {
        Console.WriteLine(
            "- {0}: {1}",
            param.Attribute("Name").Value,
            param.Value);
    }
}

Вывод выглядит так:

Test #Test1
- Param1: I am param1
- Param2: I am param2
Test #Test2
- Param1: I am param1
- Param2: I am param2
...