2016-08-05 26 views
1

我使用NHibernate和我有一個查詢中,我試着去選擇日期時間並將其轉換爲字符串:NHibernate的 - 轉換日期時間爲String裏面選擇拋出異常

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

您不能像QueryOver查詢中那樣調用'ToString'。您可能想要在查詢返回後使用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方言。本例使用FORMAT功能,可用的SQL Server 2014:

    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:

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

    你可能甚至不需要創建自定義函數,如果NHibernate的方言你使用已經支持它。

    我有一個blog post有關使用查詢中的SQL函數,如果你有興趣在走這樣一條路。 (完全披露:這是我的個人博客)。

+0

好了,所以首先這個博客是真棒,了不起,即時通訊面臨的另一個問題,我想你能幫助我。你可以看一下嗎? http://stackoverflow.com/questions/38821120/nhibernate-lists-on-selectlist – Pachu

相關問題