Дело в том, что запросы LINQ преобразуются компилятором в дерево выражений. Это дерево выражений затем преобразуется в T-SQL и передается на сервер. LINQ to SQL отображает определенные методы, такие как String.Contains, в эквиваленты T-SQL.
В первом примере LINQ, очевидно, не отображает Convert.ToInt32 ни на что, и генерируется исключение. Причина, по которой он работает во втором примере, заключается в том, что вызов Convert.ToInt32 выполняется вне запроса, поэтому он не является частью дерева выражений и не нуждается в преобразовании в T-SQL.
Эта страница MSDN описывает, как LINQ to SQL переводит различные типы данных, операторы и методы в T-SQL. (Хотя документация предполагает, что Convert.ToInt32 поддерживается, поэтому я не уверен, что еще здесь может происходить.)
Извините, только что понял, что это ADO.NET Entity Framework, а не LINQ to SQL. На этой странице перечислены сопоставления ADO.NET Entity Framework. Это немного более ограничительно, в основном потому, что ему нужно работать с несколькими провайдерами.