2014-11-05 2 views
0

두 개의 서로 다른 테이블을 포함하는 표를 채우려고합니다. 그래서 필요합니다 :ServiceStack.OrmLite Oracle 데이터베이스 건너 뛰기 및 건너 뛰기와 결합

1) 두 테이블간에 기능을 결합하십시오.

2) Skip/Take는 결과를 제한합니다. 테이블

내가 가장 ServiceStack.OrmLite에서 지원 될 것으로 보인다 이후 SqlExpression를 사용하여 수행 할

의 행

3) 총 수입니다. 그러나 Skip and Take를 수행하면 두 테이블에 같은 이름의 열이 있으므로 "ORA-00918 : column ambiguously defined"를 반환합니다. 여기

var dbCustomersQuery2 = db.From<USER>() 
.LeftJoin<USER, USERPROFILE>((user, profile) => user.Id == profile.USER_ID) 
.Where<USER>(user => user.USERNAME == "sangee.ram") 
.Where<USERPROFILE>(profile => profile.PROFILEID == 442); 
var result = db.Select<ViewModel>(dbCustomersQuery2.Skip(1).Take(5)); 

는 스택 추적입니다 : 다음과 같이

코드는

at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() 
    at ServiceStack.OrmLite.OrmLiteCommand.ExecuteReader() 
    at ServiceStack.OrmLite.OrmLiteReadCommandExtensions.ExecReader(IDbCommand dbCmd, String sql) 
    at ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ConvertToList[T](IDbCommand dbCmd, String sql) 
    at ServiceStack.OrmLite.OrmLiteReadCommandExtensions.SqlList[T](IDbCommand dbCmd, String sql, Object anonType) 
    at ServiceStack.OrmLite.OrmLiteReadExpressionsApi.<>c__DisplayClass10`1.<Select>b__f(IDbCommand dbCmd) 
    at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter) 
    at ServiceStack.OrmLite.OrmLiteReadExpressionsApi.Exec[T](IDbConnection dbConn, Func`2 filter) 
    at ServiceStack.OrmLite.OrmLiteReadExpressionsApi.Select[T](IDbConnection dbConn, ISqlExpression expression, Object anonType) 
    at LO.Leads.UI.Tests.UserSecurityTests.CanQueryUserSecurity() in c:\Git\Cons.Orig.Lead\src\LO.Leads.UI\LO.Leads.UI.Tests\UserSecurityTests.cs:line 68 

답변

0

내가 처음으로 느낀 것은 당신이 스킵을 포함 한 번, 마지막 선택 명령을 내부에 걸릴 것이 었습니다 나는 그것을 옮겨서 더 이상 예외를받지 않게되었습니다.

var userQuery = db.From<USER>() 
    .LeftJoin<USER, USERPROFILE>((user, profile) => user.Id == profile.USER_ID) 
    .Where<USER>(user => user.USERNAME == "sangee.ram") 
    .Where<USERPROFILE>(profile => Sql.In(profile.PROFILEID, new[] { 1, 441, 442, 452 })); 

var result = db.Select<ViewModel>(userQuery) 
    .Skip(1) 
    .Take(2); 

Assert.NotNull(result); 

이 테스트를 실행했을 때 가능한 4 행 중에서 2 행 (2 및 3)이 반환되었습니다.

호프가 도움이 되었으면 스티븐