2016-08-05 1 views
1
내가 NHibernate에 사용하고

던져 나는 쿼리가있는 날짜를 선택하고 문자열로 변환하려고 메신저가 다음 예외가 발생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>(); 

:

변수는 유형 'Form2.Entities.Date' ''범위에서 참조의 'X',하지만 내가 뭘 잘못

정의되지 않는 이유는 무엇입니까?

+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 언어에 따라 달라집니다.

    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에 당신이있어 방언 경우 사용자 정의 함수를 만들 필요가 없습니다 수 있습니다

    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을 생성합니다 :이 예는 2014 SQL 서버에서 사용할 수있는 FORMAT 기능을 사용 using은 이미 그것을 지원합니다.

    해당 경로에 관심이있는 경우 쿼리 내부에 SQL 함수를 사용하는 것에 대해서는 blog post입니다. (전체 공개 : 이것은 내 개인 블로그입니다.)

+0

좋아, 그래서이 블로그의 모든 첫 번째 멋진 그리고 정말 놀라운, 메신저 당신이 나를 도울 수 있다고 생각 다른 문제에 직면 해있다. 좀 봐 줄래? http://stackoverflow.com/questions/38821120/nhibernate-lists-on-selectlist – Pachu

관련 문제