Я думаю, что этот запрос должен дать вам желаемые результаты (которые, как представляется, 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
"Это предотвращает основу использования. Read/WriteXml".
Как правило, если базовый класс реализован IXmlSerializable
, Вы могли бы сделать это a virtual
метод так, чтобы конкретная версия использовалась. Как правило, Вы также использовали бы явную реализацию (а не общественные собственности) - возможно, с некоторыми protected virtual
методы для деталей реализации (хотя отслеживая то, где читатель/устройство записи через различные классы, было бы кошмаром).
AFAIK, нет никакого способа снова использовать XmlSerializer
записать основные биты, в то время как Вы добавляете полученные биты. IXmlSerializable
является бескомпромиссным.
почему бы просто не использовать XmlSerializer в вашей функции чтения / записи?
XmlSerializer s = new XmlSerializer(typeof(Foo));
s.Serialize(writer, base);
Улучшение ответа 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", он прост и понятен. Вам даже не нужно использовать атрибуты, они помогут вам настроить сериализацию.