2009-08-07 4 views
4

현재 엔티티 프레임 워크를 사용하고 있는데 두 개의 열에 조인을 사용하는 Linq 쿼리를 수행하려고합니다. 하나는 유형이 'String'이고 다른 하나는 'Int32'유형의Linq 2 엔티티 : 서로 다른 유형의 두 열에 대한 조인 수행

Somethign 유사한 INT32

같은 문자열 및 obj2.Id 등 obj.SecondEntityId와
from FirstEntity obj in context.FirstEntity 
         join SecondEntity obj2 in context.SecondEntity on obj.SecondEntityId equals obj2.Id.ToString() 

는 불행하게도,의 toString 작업은 EF에 의해 지원 될 볼 수 없습니다. (나는 INT32로 문자열을 변환 할 경우, 또는 유사한 오류) 나는이 오류와 함께 박히 : 메소드 엔티티에

LINQ는 방법 '선택 System.String ToString()를'인식하지 못하는

및 지금까지는 작업을 찾을 수 없었습니다.

도움이 필요하면 Thx.

답변

0

LINQ to SQL에서는 Convert.ToString(obj2.Id)을 사용할 수 있지만 EF에서는 지원하지 않습니다 (this thread on MSDN 참조). 그러나 Model Defined Function을 사용할 수 있습니다.

업데이트 : 그것이 EF 솔루션이 작동하지 않는 것 때문에, 나는 당신의 int 필드와 SQL보기를 만들 것이다 변환 및 어떤 다른 분야 당신이 필요합니다. 또는 기존 항목을 유지하고 intstring ID가있는 2 열보기에 가입 할 수 있습니다. 쿼리 최적화 프로그램은 성능에 미치는 영향을 무시할 수 있도록하기 위해 수행중인 작업을 파악할 수 있어야합니다.

+0

실제로 Convert.ToString도 작동하지 않습니다. 모델 정의 함수를 살펴 보았습니다. 4.0 버전을 계획하지 않았다면 실제로 문제가 해결되었을 것입니다 (3.5 버전과 함께 제공되는 1.0 버전을 사용해야 함). –

+0

보기가 채택 된 솔루션이었으며 완벽하게 작동합니다. 고마워. –

2

우리는 일반적으로이 쿼리를 2 개의 쿼리 (Entity 지원에 대한 Linq의 부족)로 제한하여 작은 자식을 해치려합니다.

var query1 = (from SecondEntity obj2 in context.SecondEntity 
      select obj2.ID).ToList(); 

// now we're using linq to objects which does support ToString() 
query1 = query1.Select(x => x.ToString()); 

// mixing linq to entities and linq to objects 
var query2 = from FirstEntity obj in context.FirstEneity 
      join SecondEntity obj2 in query1 on obj.SecondEntityId equals obj2.ID 

나는 VS없이이 일을 해요, 그래서 구문의 일부는 잘못 될 수 있고이 특히 좋은 해결책이 아니다, 그러나 EF V1이다.

+0

사실, 아날로그 솔루션과 관련한 기사를 찾았지만 성능/메모리 소비 오버 헤드가 너무 걱정됩니다. 테이블에 많은 양의 데이터가 포함될 수 있으며 이러한 종류의 트릭은 OutOfMemory 예외로 나타날 수 있습니다. EF와 관련된 솔루션을 찾지 못하면 db 측 (Stored procedure 또는 필요한 유형의 다른 필드 + 트리거)에 솔루션을 구현하는 것이 좋습니다. 어쨌든 힌트를 주셔서 감사합니다. –

+0

가치가있는 것을 위해 우리는 20 억 이상의 행이있는 테이블에 대해 이와 같은 다중 조인을 수행합니다 (데이터 선택에서 더 선택적 임). 색인 및 통계가 올바르게 설정되어있는 한 실적은 우리에게 문제가되지 않았습니다. –

+0

사실 우리 테이블에는 2 천만 개 이상의 행이 들어 있지 않습니다. :). 어제에 언급했듯이보기가 완료되었습니다.이 솔루션은 정상입니다. DB에보다 적절한 (또는 덜 부정한) 디자인을 제공합니다. 두 열 모두 Id가 있지만 "다른 소프트웨어와의 interop 제약"으로 인해 문자열 열을 유지해야합니다 ... 여유 시간이 되 자마자 해결책을 테스트 할 것입니다. 그냥 생각 : 요청을 2로 나누면 2 단계를 수행하기 위해 1 단계의 전체 결과 집합을 메모리에로드해야합니다. 첫 번째가 많은 데이터를 반환하면 사용 가능한 메모리에 과부하가 걸릴 수 있습니다. 내가 잘못 ? –

0

마지막으로 테이블을 기반으로 뷰를 만들었으며 DB 필드에 변환 된 문자열을 유지하는 새로운 int 필드를 사용했습니다. 그런 다음 EF 엔티티를 뷰에 매핑했습니다. 그것은 작동합니다 :)

슬픈 나는 EF 측면에서 적절한 해결책을 찾지 못했습니다. 바라건대, 4.0 버전은 이런 종류의 문제를 해결할 것입니다.

어쨌든, 도움을 요청하십시오.

0

특수한 Linq 구문 대신 기능적 C# 구문을 사용하면 도움이됩니까?

var results = FirstEntity.Join(SecondEntity, 
    obj => obj.SecondEntityId, obj2 => obj2.Id.ToString(), 
    (obj, obj2) => new { First = obj, Second = obj2 }); 
+0

나는 두 개의 별도 SQL 쿼리를 대신 생성합니다. 다른 열 유형 때문에 발생합니다. – Oleg

관련 문제