Ответ 1
Erwin, просто чтобы закрыть цикл на этом: мы подтвердили, что это ошибка, которую мы недавно ввели в LINQ to Entities, и мы рассматриваем способы получения исправления. Большое спасибо за сообщение об этом!
После обновления с 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 прекрасно!
Может ли кто-нибудь подтвердить/объяснить эту новую "функцию"?: -)
Erwin, просто чтобы закрыть цикл на этом: мы подтвердили, что это ошибка, которую мы недавно ввели в LINQ to Entities, и мы рассматриваем способы получения исправления. Большое спасибо за сообщение об этом!
Проведя еще некоторое исследование, я пришел к выводу, что проблема в анонимном классе, который я возвращаю из запроса 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();
}