如何在NHibernate命名的IQuery参数上设置C#可空值类型的值?

如何在NHibernate命名的IQuery参数上设置C#可空值类型的值?,nhibernate,null,parameters,Nhibernate,Null,Parameters,我正在使用NHibernate并通过命名查询调用存储过程: <sql-query name="SearchStuff" read-only="true" cacheable="true"> <return class="ResultEntity" /> EXEC [SearchStuff] ?, ?, ? </sql-query> 我尝试过各种版本,但都不管用。上述代码失败,错误如下: System.ArgumentNullException

我正在使用NHibernate并通过命名查询调用存储过程:

<sql-query name="SearchStuff" read-only="true" cacheable="true">
  <return class="ResultEntity" />
  EXEC [SearchStuff] ?, ?, ?    </sql-query>
我尝试过各种版本,但都不管用。上述代码失败,错误如下:

System.ArgumentNullException : A type specific Set(position, val) should be called because the Type can not be guessed from a null value.
我还尝试了简单地不设置参数,但NHibernate要求设置每个参数。我尝试过使用位置版本和命名版本,结果相同


有没有办法在NHibernate命名查询中为值类型的参数分配空值?

好的,结果是SetParameter上有一些覆盖,允许显式设置类型。例如:

query.SetParameter(position, null, NHibernateUtil.Int32);

完整扩展方法(仅适用于Int32和DateTime)现在是:


带有链接的完整扩展方法(仅适用于Int32和DateTime)现在是:

public static class QueryExtensions
{
    public static IQuery SetInt32(this IQuery __query, int __position, int? __val)
    {
        var _query = __val.HasValue ? __query.SetInt32(__position, __val.Value) : __query.SetParameter(__position, null, NHibernateUtil.Int32);

        return _query;
    }

    public static IQuery SetInt32(this IQuery __query, string __name, int? __val)
    {
        var _query = __val.HasValue ? __query.SetInt32(__name, __val.Value) : __query.SetParameter(__name, null, NHibernateUtil.Int32);

        return _query;
    }

    public static IQuery SetDateTime(this IQuery __query, int __position, DateTime? __val)
    {
        var _query = __val.HasValue ? __query.SetDateTime(__position, __val.Value) : __query.SetParameter(__position, null, NHibernateUtil.DateTime);

        return _query;
    }

    public static IQuery SetDateTime(this IQuery __query, string __name, DateTime? __val)
    {
        var _query = __val.HasValue ? __query.SetDateTime(__name, __val.Value) : __query.SetParameter(__name, null, NHibernateUtil.DateTime);

        return _query;
    }
}

另一种方法是:

query.SetParameter<int?>(0, null);
query.SetParameter<DateTime?>(1, null);
...
query.SetParameter(0,null);
query.SetParameter(1,空);
...
等等


请注意使原语类型可为空的
符号。

如果从方法返回查询对象,也可以获得正确的链接,例如:publicstaticiquiry SetDateTime(……retrunquery;感谢rbrock对上述扩展的添加。这正是我所需要的。:)
public static class QueryExtensions
{
    public static void SetInt32(this IQuery query, int position, int? val)
    {
        if (val.HasValue)
        {
            query.SetInt32(position, val.Value);
        }
        else
        {
            query.SetParameter(position, null, NHibernateUtil.Int32);
        }
    }

    public static void SetInt32(this IQuery query, string name, int? val)
    {
        if (val.HasValue)
        {
            query.SetInt32(name, val.Value);
        }
        else
        {
            query.SetParameter(name, null, NHibernateUtil.Int32);
        }
    }

    public static void SetDateTime(this IQuery query, int position, DateTime? val)
    {
        if (val.HasValue)
        {
            query.SetDateTime(position, val.Value);
        }
        else
        {
            query.SetParameter(position, null, NHibernateUtil.DateTime);
        }
    }

    public static void SetDateTime(this IQuery query, string name, DateTime? val)
    {
        if (val.HasValue)
        {
            query.SetDateTime(name, val.Value);
        }
        else
        {
            query.SetParameter(name, null, NHibernateUtil.DateTime);
        }
    }
}
public static class QueryExtensions
{
    public static IQuery SetInt32(this IQuery __query, int __position, int? __val)
    {
        var _query = __val.HasValue ? __query.SetInt32(__position, __val.Value) : __query.SetParameter(__position, null, NHibernateUtil.Int32);

        return _query;
    }

    public static IQuery SetInt32(this IQuery __query, string __name, int? __val)
    {
        var _query = __val.HasValue ? __query.SetInt32(__name, __val.Value) : __query.SetParameter(__name, null, NHibernateUtil.Int32);

        return _query;
    }

    public static IQuery SetDateTime(this IQuery __query, int __position, DateTime? __val)
    {
        var _query = __val.HasValue ? __query.SetDateTime(__position, __val.Value) : __query.SetParameter(__position, null, NHibernateUtil.DateTime);

        return _query;
    }

    public static IQuery SetDateTime(this IQuery __query, string __name, DateTime? __val)
    {
        var _query = __val.HasValue ? __query.SetDateTime(__name, __val.Value) : __query.SetParameter(__name, null, NHibernateUtil.DateTime);

        return _query;
    }
}
query.SetParameter<int?>(0, null);
query.SetParameter<DateTime?>(1, null);
...