2010-08-18 2 views
3

저장 프로 시저를 실행할 때 LINQ To SQL DataContext에서 출력 매개 변수를 다시 가져올 수 있습니까?LINQ 저장 프로 시저의 출력 매개 변수를 SQL ExecuteQuery로 캡처

IEnumerable<Address> result = 
    ExecuteQuery<Address>(((MethodInfo)(MethodInfo.GetCurrentMethod())), 
     address, pageIndex, pageSize, totalCount); 
address, pageIndexpageSize 입력 파라미터이다

TotalCount는 출력 파라미터이다.

어떻게 출력 매개 변수를 캡처 할 수 있습니까?


    [Function(Name = "Telecom.AddressSearch")] 
     private IEnumerable SearchAddress([Parameter(Name = "address", DbType = "varchar")] string address, 
              [Parameter(Name = "pageIndex", DbType = "int")] int pageIndex, 
              [Parameter(Name = "pageSize", DbType = "int")] int pageSize, 
              [Parameter(Name = "totalCount", DbType = "int")] ref int totalCount) 
     {    
      IEnumerable result = ExecuteQuery(((MethodInfo)(MethodInfo.GetCurrentMethod())), address, pageIndex, pageSize, totalCount); 

      return result; 
     }

답변

6

스콧 거스리는 저장 프로 시저와 함께 작동하는 SQL에 LINQ를 얻는 방법을 설명하는 blog post 있습니다 여기

는 매개 변수 값을 얻을 수 없습니다 다시하고 또 다른 시도이다하지만. 그의 게시물은 귀하의 질문에 직접적으로 답변하지는 않지만 작동 할 수있는 것에 대한 단서를 제공합니다. .dbml 클래스에서 메서드를 정의 할 때 "LINQ to SQL은 SPROC의 매개 변수 out을 참조 매개 변수 (ref 키워드)로 매핑합니다." 보십시오 ref 키워드를 사용하고 totalCount가 업데이트되는지보십시오.

IEnumerable r = ExecuteQuery(((MethodInfo)(MethodInfo.GetCurrentMethod())), 
    address, pageIndex, pageSize, ref totalCount); 

업데이트 :

는 좀 더 많은 연구를했고, 당신을 위해 일해야하는 방법을 발견했다. 이것은 MSDN article입니다. DataContext를 확장해야하지만, 너무 큰 문제가 있어서는 안됩니다 (이미이 작업을 수행하고있는 것처럼 보입니다). 자세한 내용은 문서를 확인하지만, 기본적인 부분은 이것이다 :

[Function(Name="dbo.CustOrderTotal")] 
[return: Parameter(DbType="Int")] 
public int CustOrderTotal([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID, [Parameter(Name="TotalSales", DbType="Money")] ref System.Nullable<decimal> totalSales) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID, totalSales); 
    totalSales = ((System.Nullable<decimal>)(result.GetParameterValue(1))); 
    return ((int)(result.ReturnValue)); 
} 

어디 '이'당신의 DataContext입니다.

업데이트 2 :

IExecuteResult는 ReturnValue 속성이 있습니다. Object 유형이므로 결과를 얻기 위해 캐스트해야하지만 결과의 Enumerable을 가져올 수 있어야합니다. 나는 것을 시도했다

IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), address, pageIndex, pageSize, totalCount); 
totalCount = ((System.Nullable<decimal>)(result.GetParameterValue(3))); 
return (IEnumerable<Address>)result.ReturnValue; 
+0

, 그러나 그것은 PARAMS [] 객체가 다른 가능한 해결책을 찾을 유효하지 않은 매개 변수 – BBurke

+0

, 내 업데이트 된 대답을 확인했다고 말했습니다 : 귀하의 경우에는이 같은 작업을해야합니다. – sgriffinusa

+0

그래, 내가 그걸 보았다.하지만 나는 그것이 작동 할 것이라고 생각하지 않았다. IexecuteResult가 Enumerable 데이터를 반환하는 방법을 보지 않았습니다. – BBurke