Харис Хасан прав. Чтобы действительно понять эту проблему, подумайте о том, в какой код SQL ваш C # может превратиться:
(CHARINDEX(MyField, '*', 1) - 1)
Но если MyField имеет значение null, это выражение само становится нулевым!
Linq2Sql не гарантирует семантику C #! Это обеспечивает хорошее приближение семантики C #, но все же близко к модели SQL.
Вы можете исправить это, сказав
MyBool = (bool?)thetable.MyField.Contains("*") ?? false
или, сказав
MyBool = thetable.MyField != null && thetable.MyField.Contains("*")
Вы также можете сделать MyBool обнуляемым, но это, вероятно, не то, что вы делаете.
Кстати, вы получите то же странное поведение при левом соединении, которое «не удастся», потому что SQL заполнит объединенную строку NULL.