C#, Xml-сериализирующий использование производного класса IXmlSerializable

Я думаю, что этот запрос должен дать вам желаемые результаты (которые, как представляется, 1 для 3/1, 2 для 4/1 и 5/1). Вы должны начать с CROSS JOIN дней и зон, затем LEFT JOIN - licensetypes и licenses для соответствующего типа лицензии и дней:

SELECT z.zoneID, DATE(c.dy) AS dy, z.seasonmax, z.daymax, COUNT(l.ID) AS sold
FROM calendar c
CROSS JOIN zones z
LEFT JOIN licensetypes t ON t.ID = @licensetype AND FIND_IN_SET(z.zoneID, t.ValidForZone)
LEFT JOIN licenses l ON l.TypeID = t.ID AND DATE(c.dy) >= DATE(l.From) AND DATE(c.dy) < DATE(l.To)
WHERE DATE(c.dy) BETWEEN @fromdate AND @todate
GROUP BY dy, z.zoneID

Демонстрация по SQLFiddle [ 115]

7
задан mafu 9 February 2009 в 12:11
поделиться

3 ответа

"Это предотвращает основу использования. Read/WriteXml".

Как правило, если базовый класс реализован IXmlSerializable, Вы могли бы сделать это a virtual метод так, чтобы конкретная версия использовалась. Как правило, Вы также использовали бы явную реализацию (а не общественные собственности) - возможно, с некоторыми protected virtual методы для деталей реализации (хотя отслеживая то, где читатель/устройство записи через различные классы, было бы кошмаром).

AFAIK, нет никакого способа снова использовать XmlSerializer записать основные биты, в то время как Вы добавляете полученные биты. IXmlSerializable является бескомпромиссным.

2
ответ дан 7 December 2019 в 07:51
поделиться

почему бы просто не использовать XmlSerializer в вашей функции чтения / записи?

XmlSerializer s = new XmlSerializer(typeof(Foo));
s.Serialize(writer, base);
1
ответ дан 7 December 2019 в 07:51
поделиться

Улучшение ответа mtlung, почему бы вам не использовать XmlSerializer? Вы можете настроить свой класс с помощью атрибута, чтобы его можно было сериализовать так, как вы хотите, и это довольно просто сделать.

using System.Xml.Serialization;

...

[XmlRoot("someclass")]
public class SomeClass
{
    [XmlAttribute("p01")]
    public int MyProperty01
    {
        get { ... }
    }

    [XmlArray("sometypes")]
    public SomeType[] MyProperty02
    {
        get { ... }
    }

    [XmlText]
    public int MyProperty03
    {
        get { ... }
    }

    public SomeClass()
    {
    }
}

Затем сериализовать и десериализовать его будет довольно просто:

void Save(SomeClass obj)
{
    XmlSerializer xs = new XmlSerializer(typeof(SomeClass));
    using (FileStream fs = new FileStream("c:\\test.xml", ...))
    {
        xs.Serialize(fs, obj);
    }
}

void Load(out SomeClass obj)
{
    XmlSerializer xs = new XmlSerializer(typeof(SomeClass));
    using (FileStream fs = new FileStream("c:\\test.xml", ...))
    {
        obj = xs.Deserialize(fs);
    }
}

И результирующий XML будет чем-то вроде this:

<someclass p01="...">
  <sometype>
    <!-- SomeType serialized objects as child elements -->
  </sometype>
  # value of "MyProperty03" as text #
</someclass>

Этот метод лучше работает с классами "POCO", он прост и понятен. Вам даже не нужно использовать атрибуты, они помогут вам настроить сериализацию.

4
ответ дан 7 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: