Я считаю, что этот запрос совершенно неверный. Во-первых, это не запрос linq-to-entity, и он никогда не будет выполнен, потому что linq to entity не может работать с индексами. Я думаю, что сравнение упорядоченных последовательностей должно быть выполнено в memory = linq-to-objects.
Другая проблема заключается в следующем:
for (int i = 0; i < locationsInRoute.Count; i++)
{
long locationId = locationsInRoute[i].LocationId;
query = query.Where(x => x.Locations.ElementAt(i).LocationId == locationId);
}
route = query.SingleOrDefault();
Я думаю, что это известная ошибка при использовании Linq, встроенного в запрос цикла и отложенном выполнении - я считаю, что это всегда сравнивает locationId
с последним элементом.
По моему мнению, наиболее эффективный способ сделать это - хранимая процедура с табличным параметром, передающая ожидаемую последовательность и использующая курсор SQL для сравнения последовательностей в хранимой процедуре.