2012-02-20 3 views
2

웹 서비스에서 문자열로 GUID를 전달하려고하지만 도로에서 충돌이 발생했습니다. GUID는 UNIQUEIDENTIFIER으로 SQL Server에 저장되며 EF는이를 GUID로 가져옵니다. 내가하고 싶은 것 것은 내 쿼리에있는 것은이 작업을 수행 : 이제GUID를 엔티티 프레임 워크로 문자열로 변환

var query = myEntities.Foo.Where(q => q.Id== Id) 
       .Select(bar => 
         new Bar() 
          { BString = bar.GUID } 
         ); 

을, C#을 사용하면 stringSystem.Guid을 변환 할 수없는 빌드 오류가 발생합니다, 그래서 당신이 할 수 있다고 생각하는 것 :

{ BString = bar.GUID.ToString() } 

또는

{ BString = Convert.ToString(bar.GUID) } 

그러나 런타임을 제외하고 모두 끝 :

예외가있었습니다. System.NotSupportedException : LINQ to 엔터티가 'System.String ToString (System.Object)'메서드의 메서드를 인식하지 못하고이 메서드를 으로 변환 할 수 없습니다.

그래서 나는 두 경우 모두, 그것은 UniqueIdentifier에서 varchar에 갈의 T-SQL과 동등한를 알아낼 수 아니에요 수집합니다.

개체를 검색하는 것 외에 다른 방법으로 각 개체를 새 개체에 복사하고 그 시점에서 guid-> 문자열을 변환하는 방법이 있습니까?

감사합니다.

+0

해결 방법이 있습니다. 막대 유형에 Guid를 문자열로 반환하는 속성을 사용하고 Linq 쿼리에서이 속성을 사용하십시오. – Beatles1692

+0

람다 명령문이 실행 된 후 쿼리의 값은 무엇입니까? – MethodMan

답변

6

외부 문자열로 변환하십시오. LINQ 문의 쿼리 부분.

var query = myEntities.Foo.Where(q => q.Id== Id).Select(r => r.GUID) 
    .AsEnumerable() 
    .Select(guid => 
    new Bar() 
    { BString = guid.ToString() } 
); 

.AsEnumerable()은 중요한 부분이다 : 그것은 데이터베이스 쿼리를 수행 한 후 클라이언트에서 더 이상 작업을 실행하는 효과를 가지고, IQueryable에서 IEnumerable에 결과를 캐스팅합니다. (당신은 또한 그 자리에 .ToArray() 또는 .ToList()를 사용할 수 있습니다.)

+0

감사합니다. 성능 테스트를받을 수있을 때까지 가지고있는 두 번째 쿼리로 작업하겠습니다. 그렇지 않으면 나는 Zruty가 언급 한 것처럼 sproc과 같은 것으로 교환해야 할 수도 있습니다. – Dio

0

을 성능이 중요하지 않은 경우, 당신이 자신을 제안 당신은 아마 수동으로 문자열에 GUID를 다시 매핑해야합니다 :

var query = from entity in myEntities.Foo 
      where entity.Id == Id 
      select new { GUID = entity.GUID }; 
var response = from item in query.ToList() 
       select new Bar { BString = item.GUID } 

이를 @Tim Rogers가 제안하는 것과 유사하지만 명시 적으로 두 개의 쿼리로 분리됩니다.

또 다른 옵션은 T-SQL의 네이티브 convert() 문을 사용하여 GUID를 문자열로 변환하는 저장 프로 시저를 작성하는 것입니다. 이렇게하면 EF가 GUID를 문자열에 자동으로 매핑 할 수없는 문제를 해결할 수 있습니다.

관련 문제