2016-08-05 4 views
1

をスロー:NHibernateは - 選択中の文字列にDateTimeのを変換すると、私はNHibernateはを使用していると私は、日時を選択し、それを文字列に変換しようとイムれるクエリ持っ例外

DateDTO dateDto = null; 
CultureInfo ci = CultureInfo.CreateSpecificCulture("he-IL"); 

var dates = _session.QueryOver<Date>() 
    .Where(x => x.Client.Id == clientId) 
    .Where(x => x.IsVisible != 0) 
    .SelectList(lst => lst 
     .Select(x => x.Id).WithAlias(() => dateDto.Id) 
     .Select(x => x.DateTime.ToString("dddd dd MMMM yyyy",ci)).WithAlias(() => dateDto.Date)) 
    .TransformUsing(Transformers.AliasToBean<DateDTO>()) 
    .List<DateDTO>(); 

次の例外がスローされます。スコープから参照

タイプの「X」変数「Form2.Entities.Date」「」が、それは私が間違って何をやっている

が定義されていませんか?

+0

「ToString」をQueryOverクエリの内部で呼び出すことはできません。クエリが戻った後に、SQL式を使用したり、日付を書式設定することができます。 –

答えて

2

TL; DR:NHibernateはQueryOverクエリをSQLに変換します。次の式をSQLに変換する方法はわかりません:

Select(x => x.DateTime.ToString("dddd dd MMMM yyyy",ci)) 

これは、エラーが発生する理由です。あなたは、いくつかのオプションがあります。

  1. を希望する日付形式を取得するために、結果にいくつかの後処理を行います。これは最も簡単な修正方法です。

    var dates = session.QueryOver<Date>() 
        .Where(x => x.IsVisible != 0) 
        .SelectList(lst => lst 
         .Select(x => x.Id) 
         .Select(x => x.DateTime)) 
         .List<object[]>() 
        .Select(o => new DateDTO 
        { 
         Id = (int)o[0], 
         Date = ((DateTime)o[1]).ToString("dddd dd MMMM yyyy", ci) 
        }); 
    
  2. は、データベース側で日付をフォーマットするカスタムSQL関数を書く:あなたはこのような何かを書くことができます。これはもう少し作業ですが、最終結果は少しきれいに見えるかもしれません。この実装はSQLの方言に依存します。この例では、SQL Server 2014で利用でき、FORMAT機能を使用しています。

    ISQLFunction formatFunction = 
        new SQLFunctionTemplate(NHibernateUtil.String, "FORMAT(?1, 'dddd dd MMM yyy', 'he-IL')"); 
    
    DateDTO dateDto = null; 
    
    session.QueryOver<Date>() 
        .Where(x => x.IsVisible != 0) 
        .SelectList(lst => lst 
         .Select(x => x.Id).WithAlias(() => dateDto.Id) 
         .Select(Projections.SqlFunction(
          formatFunction, 
          NHibernateUtil.String, 
          Projections.Property<Date>(x => x.DateTime)) 
         ).WithAlias(() => dateDto.Date)) 
        .TransformUsing(Transformers.AliasToBean<DateDTO>()) 
        .List<DateDTO>() 
        .Dump(); 
    

    これは、次のSQLを生成:NHibernateの方言は、あなたがしている場合

    SELECT 
        this_.Id as y0_, 
        FORMAT(this_.DateTime, 'dddd dd MMM yyy', 'he-IL') as y1_ 
    FROM 
        Date this_ 
    WHERE 
        not (this_.IsVisible = @p0); 
    

    をあなたも、カスタム関数を作成する必要はありません使用すると既にサポートされています。

    あなたは、そのルートに行くことに興味があるなら、クエリの中でSQL関数を使うことについて約blog postです。 (全開示:これは私の個人的なブログです)。

+0

申し訳ありませんが、このブログの最初のすごいと本当に素晴らしいです、私はあなたが私を助けることができる別の問題に直面している。あなたは見てみることができますか? http://stackoverflow.com/questions/38821120/nhibernate-lists-on-selectlist – Pachu

関連する問題