2013-05-10 3 views
2

Nhibernate 3.3을 사용하여 Sybase Ase 15 데이터베이스에 연결합니다. 제한 (또는 상단)을 지원하지 않는 경우를 제외하고는 모두 괜찮습니다. sybase에서는 구현되지만 Nhibernate에서는 구현되지 않습니다. 해결책이 있습니까? Nhibernate 및 Sybase와 함께 한계를 구현하는 방법

은 내가이 변경하려면 CustomSybaseAse15Dialect 만들려고 다음 Linq2Nhibernate 구문을 사용

 public override bool SupportsLimitOffset 
{ 
    get { return true; } 
} 

public override SqlString GetLimitString(SqlString sql, SqlString offset, SqlString limit) 
{  
    int insertionPoint = GetAfterSelectInsertPoint(sql); 

    if (insertionPoint > 0) 
    { 
     SqlStringBuilder limitBuilder = new SqlStringBuilder(); 
     limitBuilder.Add("select"); 
     if (insertionPoint > 6) 
     { 
      limitBuilder.Add(" distinct "); 
     } 
     limitBuilder.Add(" top "); 
     limitBuilder.Add(limit); 
     if (offset != null) 
     { 
      limitBuilder.Add(" start at "); 
      limitBuilder.Add(offset); 
     } 
     limitBuilder.Add(sql.Substring(insertionPoint)); 
     return limitBuilder.ToSqlString(); 
    } 
    else 
    { 
     return sql; // unchanged 
    } 
} 

/// <summary> 
/// Copied from MsSql2000Dialect. 
/// </summary> 
private int GetAfterSelectInsertPoint(SqlString sql) 
{ 
    if (sql.StartsWithCaseInsensitive("select distinct")) 
    { 
     return 15; 
    } 
    if (sql.StartsWithCaseInsensitive("select")) 
    { 
     return 6; 
    } 
    throw new NotSupportedException("The query should start with 'SELECT' or 'SELECT DISTINCT'"); 
} 

를, 그것은

Session.Query<product>().First() 

제한과 좋은 올바르게 1로 설정되어 작동하지만 나는이

을 할 경우
Session.Query<product>().Take(3).ToList() 

"?"로 제한됩니다.

어떻게해야합니까?

+1

이 될 것 같다 (SupportsLimit는 그것을 기본값 무엇에) "위에 X를 선택"의 자리에 대한 지원의 부족을 해결하기 위해 nHibernate 내에서 문제가 발생했습니다. https://groups.google.com/forum/?fromgroups=#!topic/nhibernate-development/TZVi8ce_Vfo – MoCapitan

+0

을 확인 했습니까? 나는 sybase로 문제에 집중했지만 당신이 옳다고 생각합니다. 수정 사항이나 가능한 해결 방법으로 바이너리를 얻는 방법을 알고 있습니까? – Eric

답변

0

이전 주석에서 언급 한 바와 같이 nHibernate에는 버그가 있습니다. 이미 정식 버전이지만 아직 공식 버전에는 포함되어 있지 않습니다.

https://nhibernate.jira.com/browse/NH-3281

당신은 주요 소스를 다운로드 할 수 있습니다 및 https://github.com/nhibernate/nhibernate-core에서 수동으로 DLL을 구축 할 수 있습니다.

이 nHibernate 수 4.1의 릴리스 버전에서 해결 : 최근에이 질문을 찾는 사람들을위한

마이클

0

.

는 또한 방언에 추가해야합니다

public override bool SupportsVariableLimit { get { return false; } } 

관련 문제