我的查询中有一个简单的case语句,基本上说如果子查询的计数为1则返回false,否则返回true。 NHibernate生成的查询是正确的但是我很难将case语句的布尔返回值转换为我的dto。
这是我的限制
var restriction = Restrictions.Eq(Projections.SubQuery(QueryOver.Of(() => alias)
.Select(Projections.Count(() => alias.Id))
.Where(x => x.AddedBy == UserProvider.Current.UserName)
.Where(() => alias.Item.Id == alias2.Id)), 1);
这是我的预测
.Add(
Projections.Conditional(restriction,
Projections.Cast(NHibernateUtil.YesNo, Projections.Constant(false)),
Projections.Cast(NHibernateUtil.YesNo, Projections.Constant(true))))
.WithAlias(() => dto.CanApply))
)
这里,我的dto中的CanApply
属性是一个布尔值。我收到的错误是{"The type System.Int32 can not be assigned to a property of type System.Boolean setter of Dto.CanApply"}
。
我已经尝试了所有我能想到的尝试让NHibernate将整数转换为布尔值。
我错过了什么?
我能够通过继承IResultTransformer
创建自定义结果转换器并检查每个别名以查看是否是导致问题的那个来解决这个问题。一旦我找到了罪魁祸首别名,我只需发出Convert.ToBoolean(tupleValue)
并将其称为一天。
任何人都可以确认我是否正在重新发明轮子,或者NHibernate是否有内置机制,我做这样的事情我不知道?
答案 0 :(得分:2)
尝试在Projections.Constant中指定类型。像这样:
.Add(
Projections.Conditional(restriction,
Projections.Constant(false, NHibernateUtil.Boolean)),
Projections.Constant(true, NHibernateUtil.Boolean))))
.WithAlias(() => dto.CanApply))
)