Подтвердить что ты не робот

Linq to EF Join throws "Индекс был вне диапазона" после обновления с VS2010 до VS2012

После обновления с Visual Studio 2010 до 2012 года код начал метать "ArgumentOutOfRangeException - индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс" по запросам Linq с использованием Joins.

Следующий простой пример, сделанный в LINQPad (с использованием модели данных EF), дает мне 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(); 
}

Изменение предыдущего примера для возврата анонимного объекта, содержащего обе стороны соединения, не дает исключение ArgumentOutOfRangeException и дает результаты как ожидалось:

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

Итак, по какой-то причине мне пришлось возвращать обе стороны соединения, но затем я попробовал следующий пример, используя вместо этого фиктивное значение, которое также выполнено без проблем:

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 прекрасно!

Может ли кто-нибудь подтвердить/объяснить эту новую "функцию"?: -)

4b9b3361

Ответ 1

Erwin, просто чтобы закрыть цикл на этом: мы подтвердили, что это ошибка, которую мы недавно ввели в LINQ to Entities, и мы рассматриваем способы получения исправления. Большое спасибо за сообщение об этом!

Ответ 2

Проведя еще некоторое исследование, я пришел к выводу, что проблема в анонимном классе, который я возвращаю из запроса Linq, я думаю, что больше не разрешено возвращать анонимный класс только с одним полем в нем я знаю, что не нужно обертывать поле в анонимный класс, но... как я уже сказал, это работало до обновления.

Следующий пример дает мне "ArgumentOutOfRangeException - Index был вне допустимого диапазона":

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

этот следующий пример работает так, как ожидалось:

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