2012-09-19 12 views
12

Después de actualizar de Visual Studio 2010 a 2012, el código comenzó a lanzar "ArgumentOutOfRangeException - El índice estaba fuera de rango. Debe ser no negativo y menor que el tamaño de la colección.Nombre del parámetro: índice "en consultas de Linq usando uniones.Linq to EF Join throws "El índice estaba fuera de rango" después de la actualización de VS2010 a VS2012

El siguiente ejemplo sencillo hecho en LINQPad (usando un modelo de datos EF) me da la 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(); 
} 

Cambio del ejemplo anterior para devolver un objeto anónimo que contiene ambos lados de la combinación no da la ArgumentOutOfRangeException y da resultados como se esperaba:

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, así que por alguna razón tuviera que volver a ambos lados de la unión, pero entonces intentado el siguiente ejemplo usando un valor ficticio en cambio, que también ejecutó sin pr oblema:

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

Tomando el primer ejemplo y la adición de un ToList() para la primera consulta también hace ejecutar sin ningún problema:

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

Importante: Tratando la primera consulta en una estación de trabajo sin la actualización de Visual Studio 2012 funciona bien!

¿Alguien puede confirmar/explicar esta nueva "función"? :-)

+2

Este error se ha presentado en [Linq to EF Join throws "El índice estaba fuera de rango" después de la actualización de VS2010 a VS2012] (https://connect.microsoft.com/VisualStudio/feedback/details/763986/linq- to-ef-join-throws-index-was-out-of-range-after-upgrade-from-vs2010-to-vs2012). Si puedes reproducirlo, díselo a Microsoft. Si una solución es importante para usted, entonces "invítala" allí. –

Respuesta

6

Erwin, sólo para cerrar el bucle en esto: Hemos confirmado que es un error que presentamos recientemente en LINQ to Entities y estamos buscando formas de solucionarlo. ¡Muchas gracias por informarlo!

+0

hey @divenga ... ¿alguna actualización sobre este problema? ¡Todo nuestro proyecto se detiene después de que el equipo se haya actualizado a VS2012! – alaasdk

+1

Estamos trabajando para enviar una corrección a este error, junto con un par de otros. No estoy seguro si es plausible, pero como descubrió, agregar una segunda propiedad ficticia al tipo anónimo solucionará el problema. –

+0

hey @alaasdk ¿podría contactarnos en netfx45compat en Microsoft dot com? Quiero ayudar a desbloquear tu equipo. – Varun

4

Después de investigar un poco más, he llegado a la conclusión de que el problema es la clase anónima que estoy devolviendo de la consulta de Linq, creo que ya no está permitido devolver una clase anónima con solo un campo, sé que no es necesario para envolver el campo en una clase anónima, pero ... como dije, esto funcionó antes de la actualización.

Siguiendo el ejemplo me da la "ArgumentOutOfRangeException - El índice está fuera del intervalo":

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

el siguiente ejemplo funciona como se esperaba:

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