J'ai donc une fonction à valeur de tableau dans ma dabatase qui effectue une requête lourde et complexe basée sur plusieurs paramètres, et renvoie par exemple trois colonnes : OrderId
, SomeCalc1
, SomeCalc2
.
Maintenant, pour traduire cela dans NHibernate, la seule solution que j'ai trouvée est d'utiliser des requêtes nommées. Mon mapping est le suivant :
<class name="OrderWithSomeExtraInfo">
<id name="OrderId" column="OrderId"/>
<many-to-one name="Order" update="false" insert="false">
<column name="OrderId"/>
</many-to-one>
<property name="SomeCalc1" column="SomeCalc1" update="false" insert="false"/>
<property name="SomeCalc2" column="SomeCalc2" update="false" insert="false"/>
</class>
<sql-query name="GetOrdersWithSomeCalc">
<return class='MyDomain.OrderWithSomeExtraInfo, MyDomain' alias='o'/>
<![CDATA[
SELECT F.SomeCalc1 AS {o.SomeCalc1}, F.SomeCalc2 AS {o.SomeCalc2}, F.OrderId AS {o.OrderId}
FROM [dbo].[funcSomething] ( :Param1, :Param2, :StartDate, :EndDate ) AS F
]]>
</sql-query>
Et ensuite, dans le code, j'appelle avec ce qui suit :
IEnumerable<OrderWithSomeExtraInfo> query =
Session.GetNamedQuery("GetOrdersWithSomeCalc")
.SetString("Param1", p1)
.SetString("Param2", p2)
.SetDateTime("StartDate", StartDate)
.SetDateTime("EndDate", EndDate)
.Future<OrderWithSomeExtraInfo>();
Et ce que je voudrais faire, c'est que, dans le code, je sois impatient de récupérer également les Order
de OrderWithSomeExtraInfo, et aussi quelques many-to-ones chaînés. Quelque chose comme ça :
IEnumerable<OrderWithSomeExtraInfo> query =
Session.GetNamedQuery("GetOrdersWithSomeCalc")
.SetString("Param1", p1)
.SetString("Param2", p2)
.SetDateTime("StartDate", StartDate)
.SetDateTime("EndDate", EndDate)
.Fetch(owse => owse.Order)
.ThenFetch(o => o.Customer)
.Future<OrderWithSomeExtraInfo>();
Cependant, je ne trouve pas le moyen de le faire, car il ne s'agit pas d'une requête NHibernate LINQ. Je ne sais donc pas comment eager fetch lorsque l'origine est une requête SQL native, ni comment mapper une fonction à l'API LINQ ou QueryOver.