stored procedures - Fluido NHibernate para consultar el procedimiento almacenado sin una asignación hbm.xml
stored-procedures fluent-nhibernate-mapping (3)
Algunas buenas respuestas aquí, sin embargo, quiero hacer una solución más genérica donde pueda pasar el objeto que quiero y configurar dinámicamente los parámetros de mi procedimiento almacenado.
public RequestList<T> FetchExport<T>(Integration_ExportType exportType)
{
var returnRequest = new RequestList<T>{Success = true};
try
{
string sql = "EXEC "+exportType.StoredProcedure+" :@" + string.Join(", :@",exportType.Parameters.GetType().GetProperties().Select(pinfo => pinfo.Name).ToArray());
var session = Session.CreateSQLQuery(sql).SetResultTransformer(Transformers.AliasToBean<T>());
foreach (var parameter in exportType.Parameters.GetType().GetProperties())
{
session.SetParameter("@" + parameter.Name, parameter.GetValue(exportType.Parameters,null));
}
returnRequest.Obj = session.List<T>().ToList();
return returnRequest;
}
catch (Exception exception )
{
returnRequest.Success = false;
returnRequest.Message = exception.Message;
returnRequest.Exception = exception;
return returnRequest;
}
}
Un ejemplo de un tipo genérico: asignado a la salida del procedimiento almacenado y crear un objeto no mapeado para los parámetros del procedimiento almacenado que se adjunta a un objeto de patente.
public class Integration_ExportRERW_Scores
{
public string SchoolId { get; set; }
public string SSID { get; set; }
public int LessonId { get; set; }
public int ClassPeriod { get; set; }
public string TeacherId { get; set; }
public string LessonTitle { get; set; }
public int RW4ComprehensionScore { get; set; }
public int RW4WordPowerScore { get; set; }
public int REComprehensionScore { get; set; }
public int REVocabularyScore { get; set; }
public int RE2ComprehensionScore { get; set; }
public int RE2VocabularyScore { get; set; }
}
public class Integration_ExportRERW_Scores_Parameters
{
public int DistrictId { get; set; }
}
Finalmente como se implementa.
var export = service.ListSubscriptions().First().Export;
var parameters = new Integration_ExportRERW_Scores_Parameters
{
DistrictId = 12060
};
export.Parameters = parameters;
var fetch = service.ExportData<Integration_ExportRERW_Scores>(export);
¿Hay alguna forma de consultar el procedimiento almacenado en Fluent Nhibernate sin crear una asignación de archivos hbm.xml?
Debería tener una clase para devolver el conjunto de resultados en mi caso es la clase GameActivity
public class GameActivity
{
public virtual DateTime Date { get; set; }
public virtual string GameRoundId { get; set; }
public virtual int GameProvider { get; set; }
public virtual string GameName { get; set; }
public virtual decimal RealBet { get; set; }
public virtual decimal RealWin { get; set; }
public virtual decimal BonusBet { get; set; }
public virtual decimal BonusWin { get; set; }
public virtual decimal BonusContribution { get; set; }
public virtual int IsRoundCompleted { get; set; }
public virtual int IsRoundCancelled { get; set; }
}
Llamando al procedimiento almacenado "GetMemberGameActivity" para obtener la lista
var result = session.CreateSQLQuery("exec GetMemberGameActivity :mToken, :StartDate, :EndDate")
.SetResultTransformer(Transformers.AliasToBean())
.SetParameter("mToken", token)
.SetParameter("StartDate", startDate)
.SetParameter("EndDate", endDate)
.List().ToList();
Supongo que usas el estándar
Session.GetNamedQuery(....
en su lugar, puedes usar
var result = Session.CreateSQLQuery("exec MyStoredProc :pUserId, :pIsLocked")
.AddEntity(typeof(MyDomainObject))
.SetParameter("pUserId", userId)
.SetParameter("pIsLocked", isLocked)
.List<MyDomainObject>();
Esto le permite llamar al proceso almacenado pero aún recuperar un objeto de dominio (o una lista de) sin necesidad de un archivo .hbm.xml.
En realidad hay este post