Вы можете сделать это в одном запросе, комбинируя ваши WHERE
условия, а затем упорядочивая их в зависимости от того, какой из них соответствует:
SELECT *
FROM users
WHERE unique_code = :unique_code OR birthday = :birthday
ORDER BY unique_code = :unique_code DESC
LIMIT 1
Если уникальный код соответствует, unique_code = :unique_code
будет равен 1, и так как мы сортируют DESCENDING, эта строка будет первой (и будет единственной строкой, оставшейся после предложения LIMIT
. Если уникальный код не совпадает, то, если есть какие-либо строки, они должны совпадать в день рождения.
[ 117] Демонстрация по dbfiddle
You could use DataContractSerializer
(but note you can't use xml attributes - only xml elements):
using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
public MyObject(Guid id) { this.id = id; }
[DataMember(Name="Id")]
private Guid id;
public Guid Id { get {return id;}}
}
static class Program {
static void Main() {
var ser = new DataContractSerializer(typeof(MyObject));
var obj = new MyObject(Guid.NewGuid());
using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
ser.WriteObject(xw, obj);
}
}
}
Alternatively, you can implement IXmlSerializable
and do everything yourself - but this works with XmlSerializer
, at least.
Вы можете использовать System.Runtime.Serialization.NetDataContractSerializer
. Он более мощный и исправляет некоторые проблемы классического сериализатора Xml.
Обратите внимание, что для этого есть различные атрибуты.
[DataContract]
public class X
{
[DataMember]
public Guid Id { get; private set; }
}
NetDataContractSerializer serializer = new NetDataContractSerializer();
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
Редактировать:
Обновление на основе комментария Марка: Вы, вероятно, должны использовать System. Runtime.Serialization.DataContractSerializer
для вашего случая, чтобы получить чистый XML. Остальной код такой же.
Поля только для чтения не будут сериализованы с использованием XmlSerializer
, это связано с природой ключевого слова readonly
из MSDN:
Ключевое слово readonly - это модификатор, который вы можете использовать в полях. Когда объявление поля включает в себя модификатор readonly, присваивания полям, введенным объявлением, могут происходить только как часть объявления или в конструкторе того же класса.
Так что ... вам в значительной степени необходимо установить поля значение в конструкторе по умолчанию ...
Its not possible with that particular serialization mode (see the other comments for workarounds). If you really want to leave your serialization mode as-is, you have to work around the framework limitations on this one. See this example
Esentially, mark the property public
, but throw an exception if it's accessed at any time other than deserialization.