Это характер Entity Framework - когда вы помещаете выражения в свой запрос, он делает все возможное, чтобы перевести их в SQL, чтобы эту работу можно было выполнить на сервере.
В вашем первом примере он пытается перевести запрос и запрос поиска в словаре в SQL и не может этого сделать, поскольку не знает, как это сделать.
Во втором примере вы просто передаете список в запрос. Он знает, как перевести это на SQL.
Есть несколько подобных ошибок, поэтому вам нужно просто помнить об этом, прежде чем определять свой запрос EF.
EDIT
Только что заметил, что ваш первый запрос использует результаты запроса при чтении из словаря. Таким образом, поскольку вы фактически не можете передать свой словарь в запрос SQL, вам, вероятно, потребуется сначала извлечь все записи из БД, а затем использовать LINQ-to-objects для выполнения вашей проверки, например:
Dictionary<int, List<int>> dict = new ...
var a = SomeEntity
.ToArray()
.Where(f => dict[f.key].Contains(f.someValue));
Метод ToArray()
вытягивает весь набор результатов в память (есть другие способы сделать это, но я обычно так делаю), и следующее предложение Where
выполняется в LINQ-to-objects вместо LINQ-to-Entities, то есть код вашего словаря будет работать нормально.