Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有IType的SetParameter不';不会导致有意义的完整查询_C#_Nhibernate_Hql - Fatal编程技术网

C# 带有IType的SetParameter不';不会导致有意义的完整查询

C# 带有IType的SetParameter不';不会导致有意义的完整查询,c#,nhibernate,hql,C#,Nhibernate,Hql,如果我这样做: NHibernate.Type.IType type = NHibernate.NHibernateUtil.GetSerializable(myValueType); hibQuery.SetParameter("UserId", intObject, type); MyValueType的类型为Type,表示Int。这不会导致有意义的事情。发送的SQL如下所示:{…}其中user0.UserId=@p0@p0=0x0001000000FFFFFF0100000000

如果我这样做:

  NHibernate.Type.IType type = NHibernate.NHibernateUtil.GetSerializable(myValueType);
  hibQuery.SetParameter("UserId", intObject, type);
MyValueType
的类型为
Type
,表示
Int
。这不会导致有意义的事情。发送的SQL如下所示:
{…}其中user0.UserId=@p0@p0=0x0001000000FFFFFF0100000000000000040100000000C0C5797374656D2E496E74333201000000076D5F76616C756500080000000B
(@p0声明时没有带任何有意义的内容)

如果我这样做(只是为了测试):

hibQuery.SetParameter(“UserId”,(int)intObject);
结果会和预期的一样好:
{…}其中user0\u0.UserId=@p0@p0=1

我做错了什么?
sl3dg3

我看不出你发布的代码有任何问题。我能想到的唯一一件事是InObject实际上不是Int32(可能它实际上是Int64或Int16,甚至是十进制,而通用版本中的强制转换隐藏了问题),或者因为它是作为对象“装箱”的,所以在不首先将其强制转换为Int32的情况下将其序列化为Int32会导致一些奇怪的行为。我将再次检查类型是否与参数的实际类型匹配

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

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

为什么要显式指定类型

这也应该起作用:

.SetParameter("UserId", intObject)

奇怪的是,我反复检查了这些类型,它们都是一样的。还以为一定是出了什么事,却什么也找不到。您基本上建议只调用
hibQuery.SetParameter(“UserId”,intObject)没有类型信息?嗯,我把代码改成了这个简化的解决方案,到目前为止它似乎还可以工作……我只是想确保NHibernate在内部使用正确的类型。但是可能真的没有必要显式地定义类型…@sl3dg3:您只需要在默认值错误时覆盖它们。
.SetParameter("UserId", intObject)