Case コンストラクトを構築する必要があるカスタム Hql ジェネレーターを構築しようとしています。この構文は、order by 句で使用されます。現在のユーザーの言語で列挙 (この場合は Gender 列挙) をアルファベット順に並べ替えようとしています。ご覧のとおり、ソート順は GenderResourceTextAttribute から取得されます。order 配列の値は、Case コンストラクトで使用する必要があります。これは私がこれまでに持っているものです:
public override HqlTreeNode BuildHql(MethodInfo method, System.Linq.Expressions.Expression targetObject, ReadOnlyCollection<System.Linq.Expressions.Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
GenderResourceTextAttribute attribute = null;
if (targetObject.Type.IsEnum)
{
attribute = targetObject.Type.GetCustomAttributes(typeof(GenderResourceTextAttribute), false).FirstOrDefault() as GenderResourceTextAttribute;
}
int[] order = attribute.GetSortOrderPosition();
return treeBuilder.Case(new HqlWhen(....));
}
[GenderResourceText]
public enum Gender
{
Unknown = 0,
Men,
Women
}
最終的には、次のSQLのようなものを生成したいと考えています:
case Gender when 0 then 1 when 1 then 2 else 0 end
どうすればこれを実装できますか?
編集:Gerbenのアドバイスに基づいて、私のソリューションを追加しました:
ありがとうゲルベン!
提供された例で、私はそれを成し遂げることができました:
public override HqlTreeNode BuildHql(MethodInfo method, System.Linq.Expressions.Expression targetObject, ReadOnlyCollection<System.Linq.Expressions.Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
EnumResourceTextAttribute attribute = (EnumResourceTextAttribute)targetObject.Type.GetCustomAttributes(typeof(EnumResourceTextAttribute), false).FirstOrDefault();
IEnumerable<int> sortOrder = attribute.GetSortOrderPositions(arguments[0].ToString() == "Descending" ? System.Data.SqlClient.SortOrder.Descending : SortOrder.Ascending);
List<HqlExpression> parameters = new List<HqlExpression>();
List<HqlWhen> hqlWhenList = new List<HqlWhen>();
for(int index = 0; index < sortOrder.Count(); index++)
{
int position = sortOrder.ElementAt(index);
hqlWhenList.Add(
treeBuilder.When(
treeBuilder.Equality(visitor.Visit(targetObject).AsExpression(), treeBuilder.Constant(index)),
treeBuilder.Constant(position)
)
);
}
HqlCase hqlCase = treeBuilder.Case(hqlWhenList.ToArray());
return hqlCase;
}