После обновления с 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 прекрасно!
Может ли кто-нибудь подтвердить/объяснить эту новую "функцию"?: -)