2012-09-19 2 views
12

Visual Studio 2010에서 2012 코드로 업그레이드 한 후 "ArgumentOutOfRangeException - 인덱스가 범위를 벗어났습니다. 컬렉션의 크기. 매개 변수 이름 : 인덱스 "조인을 사용하여 Linq 쿼리에.Linq to EF Join VS2010에서 VS2012로 업그레이드 한 후 "인덱스가 범위를 벗어났습니다."

간단한 (AN EF 데이터 모델을 사용) LINQPad에서 만든 예를 나에게 ArgumentOutOfRangeException주는 다음의 양쪽을 포함하는 익명의 개체를 반환 이전 예제를 변경

void Main() 
{ 
    var iq1 = Customers.Select(ap => ap.ID); 
    var iq2 = iq1.Join(Customers.Select(ap => ap.ID), 
        a => a, 
        b => b, 
        (a, b) => new { a }); 

    iq2.Dump(); 
} 

을하여 제공하지 않습니다 가입 어떤 이유로 내가 조인의 양쪽을 반환했다, 그래서

void Main() 
{ 
    var iq1 = ActionPlans.Select(ap => ap.ID); 
    var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID), 
        a => a, 
        b => b, 
        (a, b) => new { a, b }); 

    iq2.Dump(); 
} 

좋아,하지만 나는 또한 홍보없이 실행 대신에 더미 값을 사용하여 다음과 같은 예를 들어, 시도 : ArgumentOutOfRangeException 및 제공 결과는 예상대로 oblem :

void Main() 
{ 
    var iq1 = ActionPlans.Select(ap => ap.ID); 
    var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID), 
        a => a, 
        b => b, 
        (a, b) => new { a, x = 1 }); 

    iq2.Dump(); 
} 

제 예를 취하고 또한 문제없이 실행할 수 최초 쿼리에 ToList()을 가산 : 않고 워크 스테이션에서 제 질의 시도 :

void Main() 
{ 
    var iq1 = ActionPlans.Select(ap => ap.ID).ToList(); 
    var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID), 
        a => a, 
        b => b, 
        (a, b) => new { a }); 

    iq2.Dump(); 
} 

중요 Visual Studio 2012 업그레이드가 잘 작동합니다!

누구든지이 새로운 "기능"을 확인/설명 할 수 있습니까? :-)

+2

이 버그는 [Linq가 EF Join에 "VS2010에서 VS2012로 업그레이드 한 후"인덱스가 범위를 벗어났습니다.]에서 제기되었습니다 (https://connect.microsoft.com/VisualStudio/feedback/details/763986/linq- to-ef-join-throws-index-of-out-of-range-after-of-upgrade-from-vs2010-to-vs2012)를 지원합니다. 재현 할 수 있으면 Microsoft에 알려주십시오. 수정본이 중요한 경우, "수정"하십시오. –

답변

6

어윈, 그냥이에 루프를 닫습니다 :

void Main() 
{ 
    var iq1 = ActionPlans.Select(ap => ap.ID).ToList(); 
    var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID), 
        a => a, 
        b => b, 
        (a, b) => new { a }); 

    iq2.Dump(); 
} 

이 다음 예제는 예상대로 작동합니다 : LINQ to Entities에서 최근에 소개 한 버그이며 수정 방법을 찾고 있습니다. 보고 해 주셔서 감사합니다.

+0

안녕하세요. @divenga ..이 문제와 관련하여 어떤 업데이트가 있습니까? 팀이 VS2012로 업그레이드 한 후에 우리의 전체 프로젝트가 중단되었습니다! – alaasdk

+1

우리는 다른 버그와 함께이 버그를 수정하려고 노력 중입니다. 그럴듯한 지 확신 할 수는 없지만 익숙한 유형에 두 번째 더미 속성을 추가하면 문제가 해결됩니다. –

+0

안녕하세요 @alaasdk Microsoft.com에서 netfx45compat에 문의하실 수 있습니까? 팀을 차단 해제하는 데 도움을 드리고 싶습니다. – Varun

4

이 문제를 좀 더 조사해 본 결과 문제가 Linq 쿼리에서 반환되는 익명의 클래스라는 결론에 도달했습니다. 더 이상 익명 클래스를 반환 할 수 없다고 생각합니다. 그것의 필드가 하나 밖에 없으므로 익명의 클래스에서 필드를 래핑 할 필요가 없다는 것을 알지만 ... 업그레이드하기 전에이 필드가 작동한다고했습니다. 예를 들어 다음

는 나에게 "ArgumentOutOfRangeException을 - 인덱스가 범위를 벗어났습니다"제공 :

void Main() 
{ 
    var iq1 = ActionPlans.Select(ap => ap.ID).ToList(); 
    var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID), 
        a => a, 
        b => b, 
        (a, b) => a); 

    iq2.Dump(); 
} 
관련 문제