2016-11-04 8 views
2

: 나는 특성으로 쿼리를 노출 할 때언제 보간 문자열을 평가합니까? 내가 다음 코드를 한

internal class Constants 
    { 
     internal static string Source { get; set; } 

     #region EvaluationRepository 
     internal static string QUERY_001 = [email protected]" 
select 
    e.* 
from {Source} e 
where 
    e.id = @Id 
"; 

     internal static string QUERY_002 = [email protected]" 
select 
    e.* 
from {Source} e 
where 
    [email protected] 
    and e.begindate >= @FromDate 
    and e.enddate <= @ToDate 
"; 

     internal static string QUERY_003 
     { 
      get 
      { 
       return [email protected]" 
select 
    d.statusid [StatusId], 
    count(1) [Count] 
from 
    (select e.statusid 
    from {Source} e 
    where e.begindate >= @FromDate and e.enddate <= @ToDate) d 
group by d.statusid 
"; 
      } 
     } 
     #endregion 
    } 

유일한 시간 {Source}이 가득입니다. (QUERY_003)
필드으로 노출되면 작동하지 않습니다. (QUERY_001, QUERY_002)

이유를 설명 할 수있는 사람이 있습니까? 정적이기 때문에 (확실한 단어가 아닌지)? 그것은 런타임에 끝났다는 SQL :

+1

정말, 문자열 보간은 여기에 빨간색 청어입니다. 당신은 효과적으로 "언제 필드 이니셜 라이저를 평가합니까?"라고 묻고 있습니다. –

+0

네, {Source} 필드가 채워지지 않아 문자열을 노출하기 때문에 그렇습니다. – grmbl

+2

'static' 클래스는'static' 클래스를 처음으로 초기화 할 때 값을 생성하므로'Source'를 변경하면 효과가 없습니다. 그러나 속성은 접근 할 때 새로운'string'에 대한 최신 값을 사용하여 새로운'string'을 초기화 할 것입니다. – juharr

답변

3

의 그대로 보간 소음 죄송

. string.Format을 사용하는 것과 같습니다 (생성 된 IL까지).

필드가으로 채워지지 않는 이유는 처음에 (정적 클래스가 초기화 될 때) Source이 비어 있기 때문입니다.

+0

예! 그게 전부 야. 나는 정적 생성자로 그것을 속일 수 있고 그것을 증명할 기본값을 제공 할 수있다. – grmbl

+0

또한 string.Format 대신 String.Format을 참조하십시오. * trollface – grmbl

+0

@grmbl'string'과'String'은 같은 것입니다. 'string'은'String' 클래스의 별칭 인 언어 키워드입니다. – MgSam