2012-09-19 7 views
12

Nach der Aktualisierung von Visual Studio 2010 auf 2012 begann Code "ArgumentOutOfRangeException - Index war außerhalb des Bereichs. Muss nicht negativ sein und weniger als die Größe der Sammlung.Parametername: Index "auf Linq-Abfragen mit Joins.Linq to EF Join Würfe "Index war außerhalb des Bereichs" nach Upgrade von VS2010 auf VS2012

Das folgende einfache Beispiel in LINQPad gemacht (ein EF Datenmodell) gibt mir die 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(); 
} 

das vorherige Beispiel Ändern beiden Seiten des einen anonymen Objekt zurückzugeben, enthält der Join nicht geben ArgumentOutOfRangeException und gibt die Ergebnisse wie erwartet:

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(); 
} 

Ok, also aus irgendeinem Grunde ich beiden Seiten des Join zurückkehren musste, aber dann habe ich versucht, das folgende Beispiel einen Dummy-Wert verwendet stattdessen, die auch ohne pr ausgeführt 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(); 
} 

das erste Beispiel nehmen und das Hinzufügen eines ToList() mit der ersten Abfrage macht es auch ohne Probleme ausführen:

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(); 
} 

Wichtig: auf einer Arbeitsstation die erste Abfrage Der Versuch, ohne Das Upgrade von Visual Studio 2012 funktioniert einwandfrei!

Kann jemand dieses neue "Feature" bestätigen/erklären? :-)

+2

Dieser Fehler wurde bei [Linq to EF Join throws "Index war außerhalb des Bereichs" nach dem Upgrade von VS2010 auf VS2012] abgelegt (https://connect.microsoft.com/VisualStudio/feedback/details/763986/linq- to-ef-join-throws-index-war-außerhalb-bereich-nach-upgrade-von-vs2010-zu-vs2012). Wenn Sie es reproduzieren können, dann sagen Sie Microsoft. Wenn Ihnen eine Lösung wichtig ist, "upvoten" Sie sie dort. –

Antwort

6

Erwin, nur die Schleife auf diese zu schließen: Wir haben bestätigt, dass es sich um einen Fehler handelt, den wir kürzlich in LINQ to Entities eingeführt haben, und wir suchen nach Wegen, um eine Lösung zu finden. Vielen Dank für die Meldung!

+0

hey @divenga .. irgendwelche Updates zu diesem Thema? Unser ganzes Projekt wird gestoppt, nachdem das Team auf VS2012 aufgerüstet wurde! – alaasdk

+1

Wir arbeiten daran, eine Fehlerbehebung für diesen Fehler zu erhalten, zusammen mit ein paar anderen. Ich bin mir nicht sicher, ob es plausibel ist, aber wie Sie herausgefunden haben, wird das Problem durch Hinzufügen einer zweiten Dummy-Eigenschaft zum anonymen Typ behoben. –

+0

hey @alaasdk können Sie uns auf netfx45compat bei Microsoft dot com kontaktieren? Ich möchte helfen, dein Team zu entblocken. – Varun

4

Nachdem ich diese mehr Untersuchung gegeben habe, bin ich zu der Schlussfolgerung gekommen, dass das Problem die anonyme Klasse ist, die ich von der Linq-Abfrage zurückgebe, ich denke, dass es nicht mehr erlaubt ist, eine anonyme Klasse zurückzugeben Mit nur einem Feld darin, ich weiß, dass es nicht notwendig ist, das Feld in einer anonymen Klasse einzuwickeln, aber ... wie gesagt, das funktionierte vor dem Upgrade.

Das folgende Beispiel gibt mir die "ArgumentOutOfRangeException - Index war außerhalb des Bereichs":

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(); 
} 

das nächste Beispiel funktioniert wie erwartet:

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(); 
} 
Verwandte Themen