Сериализация значения в OData
Есть ли функция (возможно, в ODataLib 5.6.1) для сериализации примитивного типа.NET в формат OData URI ( см.)
например:
new DateTime(2000,12,12).ToODataString() //would return: datetime’2000-12-12T12:00′
2 ответа
Решение
Статический класс Microsoft.Data.OData.Query.ODataUriUtils позволяет вызывать ConvertToUriLiteral для сериализации значения в литерал uri.
public static string ConvertToUriLiteral(object value, ODataVersion version)
public static string ConvertToUriLiteral(object value, ODataVersion version, IEdmModel model)
public static string ConvertToUriLiteral(object value, ODataVersion version, IEdmModel model, ODataFormat format)
И вы можете вызвать ConvertFromUriLiteral для выполнения десериализации.
public static object ConvertFromUriLiteral(string value, ODataVersion version)
public static object ConvertFromUriLiteral(string value, ODataVersion version, IEdmModel model, IEdmTypeReference typeReference)
Вот моя временная реализация, пока кто-то не знает функцию в ODataLib.
static public string ToODataUriString(object value)
{
if (value == null) return "null";
switch (value.GetType().FullName)
{
case "System.Guid":
return string.Format("guid'{0}'", (Guid)value);
case "System.Decimal":
return string.Format("{0}m", (decimal)value);
case "System.Single":
return string.Format("{0}f", ((Single)value).ToString("R"));
case "System.Double":
return string.Format("{0}d", ((double)value).ToString("R"));
case "System.Boolean":
return string.Format("{0}", (Boolean)value).ToLower();
case "System.DateTime":
{
DateTime dvalue = (DateTime)value;
string format;
if (dvalue.Second==0 && dvalue.Millisecond==0)
format = "yyyy-MM-ddTHH:mm"; //datetime’yyyy-mm-ddThh:mm[:ss[.fffffff]]’
else if (dvalue.Millisecond == 0)
format = "yyyy-MM-ddTHH:mm:ss"; //datetime’yyyy-mm-ddThh:mm[:ss[.fffffff]]’
else
format = "yyyy-MM-ddTHH:mm:ss.fffffff"; //datetime’yyyy-mm-ddThh:mm[:ss.fffffff]]’
return string.Format("datetime'{0}'", dvalue.ToString(format));
}
case "System.DateTimeOffset":
return string.Format("datetimeoffset'{0}Z'", ((DateTimeOffset)value).ToString("s"));
case "System.Int16":
case "System.Int32":
case "System.Byte":
return value.ToString();
case "System.Int64":
return string.Format("{0}L", value);
case "System.TimeSpan":
return string.Format("time'{0}'", (TimeSpan)value);
case "System.String":
// TODO Need better quote handling for escaping, this is not correct
return string.Format("'{0}'", value.ToString().Replace("'", "''"));
default:
// TODO Need better quote handling for escaping, this is not correct
return string.Format("'{0}'", value.ToString().Replace("'", "''"));
}
}