locked
Linq to EF Join throws “Index was out of range” after upgrade from VS2010 to VS2012 RRS feed

  • Question

  • After upgrading from Visual Studio 2010 to 2012 code started throwing "ArgumentOutOfRangeException - Index was out of range. Must be non-negative and less than the size of the collection.Parameter name: index" on Linq queries using Joins.

    The following simple example made in LINQPad (using an EF data model) gives me the 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();
    }

    Changing the previous example to return an anonymous object containing both sides of the join doesn't give the ArgumentOutOfRangeException and gives results as expected:

    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, so for some reason I had to return both sides of the join, but then I tried the following example using a dummy value instead, that also executed without a problem:

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

    Taking the first example and adding a ToList() to the first query also makes it execute without a problem:

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

    Important: Trying the first query on a workstation without the Visual Studio 2012 upgrade works fine!

    Can anyone confirm/explain this new "feature"? :-)


    Erwin Bastiaensen (sharepointology.com) Dont forget to click "Mark as Answer" on the post that helped you.

    Thursday, September 20, 2012 8:26 AM

All replies

  • This issue has logged here, you can vote up it.

    Go go Doraemon!

    Monday, September 24, 2012 1:34 AM
  • After giving this some more investigation, I've come to the conclusion that the problem is the anonymous class I'm returning from the Linq query, I think it isn't allowed anymore to return an anonymous class with only one field in it, I know it isn't needed to wrap the field in an anonymous class but ... as I said this worked before upgrading.

    Following example gives me the "ArgumentOutOfRangeException - Index was out of range":

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

    this next example works as expected:

    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();
    }
    Monday, September 24, 2012 6:08 AM
  • This is a workaround for now. Let's waiting for a hotfix for this bug.

    Go go Doraemon!

    Tuesday, September 25, 2012 1:59 AM