📄 castfunction.cs
字号:
using System;
using System.Collections;
using NHibernate.Engine;
using NHibernate.SqlCommand;
using NHibernate.SqlTypes;
using NHibernate.Type;
namespace NHibernate.Dialect.Function
{
/// <summary>
/// ANSI-SQL style cast(foo as type) where the type is a NHibernate type
/// </summary>
public class CastFunction : ISQLFunction, IFunctionGrammar
{
public CastFunction()
{
}
#region ISQLFunction Members
public IType ReturnType(IType columnType, IMapping mapping)
{
//note there is a weird implementation in the client side
//TODO: cast that use only costant are not supported in SELECT. Ex: cast(5 as string)
return columnType;
}
public bool HasArguments
{
get { return true; }
}
public bool HasParenthesesIfNoArguments
{
get { return true; }
}
public SqlString Render(IList args, ISessionFactoryImplementor factory)
{
if (args.Count != 2)
{
throw new QueryException("cast() requires two arguments");
}
string typeName = args[1].ToString();
string sqlType = string.Empty;
IType hqlType = TypeFactory.HeuristicType(typeName);
if (hqlType != null)
{
SqlType[] sqlTypeCodes = hqlType.SqlTypes(factory);
if (sqlTypeCodes.Length != 1)
{
throw new QueryException("invalid Hibernate type for cast()");
}
sqlType = factory.Dialect.GetCastTypeName(sqlTypeCodes[0]);
if (sqlType == null)
{
//TODO: never reached, since GetTypeName() actually throws an exception!
sqlType = typeName;
}
//else
//{
// //trim off the length/precision/scale
// int loc = sqlType.IndexOf('(');
// if (loc>-1)
// {
// sqlType = sqlType.Substring(0, loc);
// }
//}
}
else
{
throw new QueryException(string.Format("invalid Hibernate type for cast(): type {0} not found", typeName));
}
return new SqlStringBuilder()
.Add("cast(")
.AddObject(args[0])
.Add(" as ")
.Add(sqlType)
.Add(")")
.ToSqlString();
}
#endregion
#region IFunctionGrammar Members
bool IFunctionGrammar.IsSeparator(string token)
{
return "as".Equals(token);
}
bool IFunctionGrammar.IsKnownArgument(string token)
{
return false;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -