您可以使用 OrmLite Type Converters 自定义处理不同 .NET 类型的方式,但是您将无法自定义 string,因为这会影响所有 string 字段。
相反,我刚刚在 this commit 的 PostgreSQL 中添加了对 Xml 的支持,方法是使用包装器 XmlValue 只包装 XML 字符串的类型:
public struct XmlValue
{
public string Xml { get; }
public XmlValue(string xml) => Xml = xml;
public override string ToString() => Xml;
public bool Equals(XmlValue other) => Xml == other.Xml;
public override bool Equals(object obj) => obj is XmlValue other && Equals(other);
public override int GetHashCode() => Xml != null ? Xml.GetHashCode() : 0;
public static implicit operator XmlValue(string expandedName) =>
expandedName != null ? new XmlValue(expandedName) : null;
}
所以我们可以使用PostgreSqlXmlConverter 自定义处理方式:
public class PostgreSqlXmlConverter : PostgreSqlStringConverter
{
public override string ColumnDefinition => "XML";
public override void InitDbParam(IDbDataParameter p, Type fieldType) => p.DbType = DbType.Xml;
public override object ToDbValue(Type fieldType, object value) => value?.ToString();
public override string ToQuotedString(Type fieldType, object value) =>
base.ToQuotedString(fieldType, value.ToString());
}
您可以在PostgreSqlDialect.Provider 中注册:
PostgreSqlDialect.Provider.RegisterConverter<XmlValue>(new PostgreSqlXmlConverter());
您现在可以使用XmlValue 数据类型创建表和插入行,例如:
public class XmlTest
{
public int Id { get; set; }
public XmlValue Xml { get; set; }
}
您可以使用 PostgreSQL XML 函数创建、插入和查询:
using (var db = dbFactory.OpenDbConnection())
{
db.DropAndCreateTable<XmlTest>();
db.Insert(new XmlTest { Id = 1, Xml = @"<attendee>
<bio>
<name>John Doe</name>
<birthYear>1986</birthYear>
</bio>
<languages>
<lang level=""5"">php</lang>
<lang level=""4"">python</lang>
<lang level=""2"">java</lang>
</languages>
</attendee>" });
db.Insert(new XmlTest { Id = 2, Xml = @"<attendee>
<bio>
<name>Tom Smith</name>
<birthYear>1978</birthYear>
</bio>
<languages>
<lang level=""5"">python</lang>
<lang level=""3"">java</lang>
<lang level=""1"">ruby</lang>
</languages>
</attendee>" });
var results = db.Column<string>(@"SELECT
(xpath('//bio/name/text()', Xml)::text[])[1]
FROM xml_test
WHERE cast(xpath('//bio[birthYear>1980]', Xml) as text[]) != '{}'");
results[0] //= John Doe
}
请注意,您的 PostgreSQL 安装需要为 configured --with-libxml to use the XML data type。
这项对XmlValue 支持的更改可从 v5.7.1+ 即now available on MyGet 获得。