Вы выполняете подзапрос однажды для каждой строки , тогда как соединение происходит на индексах.
Если это linq to sql, помните, что Linq просто разбирает ваш запрос в SQL.
Поэтому он отправляет оба ваших предложения where в базу данных, отсюда и исключение. Я не нахожу это удивительным, хотя, возможно, это неправильно.
Вам просто нужно будет выполнить независимую проверку.
if (!string.isNullOrEmpty(state.statecode)
q = q.where( s => s.code == state.statecode
Это не имеет отношения к LINQ в целом. В этом случае поставщик LINQ-to-SQL пытается проанализировать ваше лямбда-выражение и сделать его запросом TSQL. Он не может делать слишком много предположений, основанных на вашем выражении, поскольку он пытается делегировать большую часть работы базе данных.
Короче говоря, провайдер просто не может преобразовать его в SQL.