使用IType的SetParameter不会导致有意义的查询

时间:2011-03-03 16:30:18

标签: c# nhibernate hql

如果我这样做:

  NHibernate.Type.IType type = NHibernate.NHibernateUtil.GetSerializable(myValueType);
  hibQuery.SetParameter("UserId", intObject, type);

MyValueType属于Type类型,代表Int。这不会导致有意义的事情。发送的SQL如下所示:{...} where user0_.UserId=@p0;@p0 = 0x0001000000FFFFFFFF010000000000000004010000000C53797374656D2E496E74333201000000076D5F76616C75650008010000000B(@ p0未声明有意义的内容)

如果我这样做(仅用于测试):

hibQuery.SetParameter<int>("UserId", (int)intObject);

结果会像预期的那样正常:{...}where user0_.UserId=@p0;@p0 = 1

我在这里做错了什么? sl3dg3

2 个答案:

答案 0 :(得分:1)

我发布的代码没有任何问题。我唯一能想到的是intObject实际上不是Int32(可能它实际上是Int64或Int16甚至是Decimal,并且泛型版本中的强制转换隐藏了问题),或者因为它被“装箱”为对象,将其序列化为Int32而不首先将其强制转换为Int32会导致一些奇怪的行为。我会仔细检查类型是否与参数的实际类型匹配。

如果对象类型REALLY正确,并且您确实需要动态类型,请尝试让NHibernate“猜测”传递值的类型。运行时应始终知道对象的实际类型,因此NH可以在不指定IType(可能是错误的)的情况下发现它。如果你确定类型是正确的,你也可以反思地调用在测试中起作用的通用方法:

var setParamMethod = hibQuery.GetType().GetMethod("SetParameter`1");
setParamMethod.MakeGenericMethod(myValueType)
    .Invoke(nhibQuery, new object[]{"UserId", intObject});

答案 1 :(得分:0)

为什么要明确指定类型?

这也应该有效:

.SetParameter("UserId", intObject)