Używam NHibernate i wywołanie procedury przechowywanej za pomocą kwerendy o nazwie:W jaki sposób wartości wpisane wartości zerowej C# można ustawić na parametrach IQuery o nazwie NHibernate?
<sql-query name="SearchStuff" read-only="true" cacheable="true">
<return class="ResultEntity" />
EXEC [SearchStuff] ?, ?, ? </sql-query>
Wiele parametrów procedury składowanej są celowo pustych - to nie może być zmieniony.
C#:
IQuery listQuery = this.Session.GetNamedQuery("SearchStuff");
listQuery.SetInt32(0, param1);
listQuery.SetDateTime(1, param2);
listQuery.SetString(2, param3);
IList<ResultEntity> results = listQuery.List<ResultEntity>();
Niestety, NHibernate nie dostarcza żadnych SetXyz() metody dla typów wartości pustych więc próbowałem dodając niektóre metody rozszerzenie do kompensacji:
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);
}
}
public static void SetInt32(this IQuery query, string name, int? val)
{
if (val.HasValue)
{
query.SetInt32(name, val.Value);
}
else
{
query.SetParameter(name, null);
}
}
public static void SetDateTime(this IQuery query, int position, DateTime? val)
{
if (val.HasValue)
{
query.SetDateTime(position, val.Value);
}
else
{
query.SetParameter(position, null);
}
}
public static void SetDateTime(this IQuery query, string name, DateTime? val)
{
if (val.HasValue)
{
query.SetDateTime(name, val.Value);
}
else
{
query.SetParameter(name, null);
}
}
}
Próbowałam różne wersje tych, ale żadne nie działają. Powyższy kod nie powiedzie się z powodu błędu:
System.ArgumentNullException : A type specific Set(position, val) should be called because the Type can not be guessed from a null value.
Próbowałem też po prostu nie ustawienie parametru ale NHibernate wymaga każdy parametr do ustawienia. Próbowałem używać zarówno wersji pozycyjnej, jak i nazwanych z tymi samymi wynikami.
Czy istnieje sposób na przypisanie wartości pustych do wartości wpisanych parametrów w kwerendach o nazwie NHibernate?
Dzięki za to, pomóż mi :) – RhysC
Jeśli zwróci przedmiot zapytania z metod można również uzyskać łańcuchowy poprawne, np: public static IQuery SetDateTime (... ... Retrun zapytanie; –
Twarde rozszerzeń ! –