1

Entity Framework 및 WCF Data Services (OData)를 통해 저장 프로 시저를 호출하려고했습니다. 복합 유형이 아닌 엔티티를 리턴합니다. 다음 연습은 모두 (이 one 같은) 웹을 통해 발견, 나는 내 서비스 내부에이 코드를 내놓았다 :

[WebGet] 
public IQueryable<Entity> GetEntitiesByParameterId(int parameterId) 
{ 
    return CurrentDataSource.GetEntitiesByParameterId(parameterId).AsQueryable(); 
} 

proc 디렉토리 이런 식으로 호출 : ~WcfService.svc/GetEntitiesByParameterId?parameterId=1는 저장 프로 시저를 실행하고 반환되어야 개체를 반환합니다. 문제 없습니다.

사용할 때까지 모든 것이 잘 작동합니다. $ 선택 OData 옵션 ie. ~WcfService.svc/GetEntitiesByParameterId?parameterId=1&$select=name. 디버깅시 위의 메서드는 오류없이 실행되지만 을 반환합니다. 클라이언트에 도달 할 때 작업이 런타임에 불안정해질 수 있습니다. 오류. 많은 연구 끝에 많은 다른 원인을 지적하는 것은 매우 일반적인 오류입니다. 나는 나의 특별한 문제와 정말로 일치하는 것을 찾지 못했다. 가장 가까운 것은 thisthis이지만 내 솔루션에는 아무 것도 작용하지 않았습니다. 이것은 DS WCF 알려진 한계이다

: 상기 제 문서에서도

. ...

둘째로 LINQ 에서 EF까지는 LINQ to Objects보다 약간 다른 LINQ 표현식이 필요하기 때문에 일부 쿼리가 올바르게 작동하지 않는 경우가 있습니다 ( 경우). 당신이보고있는 문제는 어느 것입니까?

2012 년에 게시되었습니다. 사실이라면 아직 업데이트되지 않았습니까? 그리고 저장된 proc 호출에 대해 $ select가 작동하도록하는 다른 해결 방법이 있습니까?

TL; DR :

작품 :

~WcfService.svc/GetEntitiesByParameterId?parameterId=1 
~WcfService.svc/GetEntitiesByParameterId?parameterId=1&$top=1 
~WcfService.svc/GetEntitiesByParameterId?parameterId=1&$skip-5 
~WcfService.svc/GetEntitiesByParameterId?parameterId=1&$filter={filter query} 
~WcfService.svc/GetEntitiesByParameterId?parameterId=1&$expand=SomeNavigationProperty 

가 작동하지 않습니다 :

~WcfService.svc/GetEntitiesByParameterId?parameterId=1&$select=name 

기술 정보 :

EntityFramework 5, WCF 데이터 서비스 5.0, 나는 또한 EF6와 WCF 5.6.2로 업그레이드를 시도하고 그것은 여전히 ​​작동하지 않았다 * 중 하나로, OData V3

.

도움을 주시면 감사하겠습니다. 감사!


UPDATE : 조금 더, 내가 저장 프로 시저를 통과 단지 수동으로 다음 List<Entity> 건설 된 쿼리로 반환 반환하지 시도이를 통해 멍청이 후 . $ select를 사용할 때 여전히 동일한 오류가 있음을 알면 놀라실 것입니다. WCF 서비스 작업 제한이 될 수 있으며 특히 저장 프로 시저 호출에만 제한이 없습니다.documentation으로 돌아가서 다른 OData 쿼리 (맨 위로, & orderby 확장)를 사용하지만 $ select에 대해서는 사용하지 않습니다.

이것은이 특정 문제에 대한 많은 소스를 찾을 수 없어 내 테스트를 통해 관찰 한 것입니다. 모든 설명 및 기타 문서를 환영합니다.

+1

$ select가 아직 지원되지 않는 것 같습니다. 그러나이 문제를 해결하려면 GetEntitiesByParameterId를 래핑하고이 작업의 이름을 선택하는 GetEntitiesNameByParameterId와 같은 다른 작업을 구현할 수 있습니다. 이 작업은 이름 모음을 반환합니다. –

+0

@LaylaLiuMSFT 안녕하세요! 고마워. 나는 당신이 말한 것을 분명히하고 싶습니다. "$ select는 아직 지원되지 않습니다." 일반적으로 WCF 서비스 작업에 대해서만 저장 프로 시저 호출 용입니까? 그리고 WCF에 대한 추가 업데이트를 포기하는 협상이 이미 있기 때문에 언제 지원 될 것인지 알고 있습니까? – iamnobody

+0

@LaylaLiuMSFT 추가 관측을 위해 내 게시물을 업데이트했습니다. 또한, 해결 방법을 주셔서 감사하지만, 나는 더 동적이고 유연한 선택을하고 싶습니다. OData가 수행하는 것과 같이 필요한만큼의 열을 추가/제거하십시오. 시간을내어 주셔서 다시 한번 감사드립니다. – iamnobody

답변

1

Layla Liu MSFT가 언급 한 바에 따르면 $ select는 아직 지원되지 않습니다. 단, 이에 대한 최종 설명서는 찾을 수 없습니다.

$ select는 데이터베이스에서 이미 가져온 데이터 셰이프를 변경하려고 시도하고 대신 동적 엔터티를 반환하려고하므로 저장 프로 시저 호출을 중단합니다. ObjectResult를 반환하는 저장된 proc에 대한 문제로 인해 엉망이 될 수 있습니다. 하드 코드 된 List<Entity>이 작동하지 않는 이유에 대해서는 어떤 생각이 들지 않습니다. 그러나 이것에 관해 나를 인용하지 마라. 제가 말했듯이, 이것은 단지 나의 관찰 일뿐입니다.

해결 방법 : 나는 간단하고 우아한 해결 방법을 발견했습니다. 내 저장된 프로 시저가 데이터베이스에서 데이터를 가져 오는 중이고 어떤 방식 으로든 (INSERT, UPDATE, DELETE) 데이터를 변경하지 않으므로 내 EF의 엔티티와 동일한 테이블을 반환하는 테이블 반환 함수를 사용하려고했습니다. Service Operation 메서드에서이 함수를 호출하면 기본적으로 필요한 것인 IQueryable<Entity>을 반환한다는 것을 알았습니다. $ select도 이제 작동하며 다른 OData 쿼리 옵션도 작동합니다.

단계 :

  1. 데이터베이스
  2. 업데이트 EDMX에 함수를 만듭니다 - 기능 추가>
  3. 는 WCF 데이터 서비스에서 서비스 작업을 만들기 엔티티의 반환 형식과 새로운 기능 가져 오기 추가 그 전화는 CurrentDataSource.<FunctionName>()
  4. 피들러에서 테스트합니다.

CODES

데이터베이스 기능 :

CREATE FUNCTION GetEntities(@parameter) 
RETURN @entites TABLE(
    [Id] [int], 
    [Name] [nvarchar](100), 
    ... 
) 
AS 
BEGIN  
    INSERT INTO @entities 
     SELECT [Id], [Name], ... FROM [EntityTable] 

    RETURN  
END 

WCF :

[WebGet] 
public IQueryable<Entity> GetEntity(int parameter) 
{ 
    return CurrentDataSource.GetEntity(parameter); 
} 

그것은 실제로 저장 프로 시저 문제를 해결하지는 않지만 누군가가 내가하려고하는 것을 해결할 때까지 더 나은 것을 제공 할 때까지 이것을 대답으로 표시하고 있습니다.

다른 사람들에게도 도움이되기를 바랍니다. :)