web-dev-qa-db-ja.com

hbm.xmlマッピングなしでストアドプロシージャをクエリするための流暢なNHibernate

Hbm.xmlファイルマッピングを作成せずにFluentNhibernateでストアドプロシージャをクエリする方法はありますか?

19
rahul

私はあなたが標準を使用すると仮定します

Session.GetNamedQuery(....

代わりに、

var result = Session.CreateSQLQuery("exec MyStoredProc :pUserId, :pIsLocked")
                    .AddEntity(typeof(MyDomainObject))
                    .SetParameter("pUserId", userId)
                    .SetParameter("pIsLocked", isLocked)
                    .List<MyDomainObject>();

これにより、ストアドプロシージャを呼び出すことができますが、.hbm.xmlファイルを必要とせずにドメインオブジェクト(またはのリスト)を取得できます。

実際にはこの投稿があります

27
icepicker

私の場合は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; }
    }

ストアドプロシージャ「GetMemberGameActivity」を呼び出してリストを取得する



    var result = session.CreateSQLQuery("exec GetMemberGameActivity :mToken, :StartDate, :EndDate")
                        .SetResultTransformer(Transformers.AliasToBean())
                        .SetParameter("mToken", token)
                        .SetParameter("StartDate", startDate)
                        .SetParameter("EndDate", endDate)
                        .List().ToList();

4
Arkadas Kilic

ここでいくつかの良い答えがありますが、必要なオブジェクトを渡してストアドプロシージャパラメータを動的に設定できる、より一般的なソリューションを作成したいと思います。

 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;

         }
     }

ジェネリック型の例-ストアドプロシージャの出力にマップされ、パテントオブジェクトにアタッチされるストアドプロシージャパラメータのマップされていないオブジェクトを作成します。

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; }
}

最後にそれがどのように実装されるか

 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);
1
WeisserHund