Это может быть из-за того, как интерпретируется лямбда; с "Guid.Empty", "Guid.Empty" является частью окончательной лямбды. Интересно, рассматривает ли LINQ-провайдер это как особый случай?
Вы можете попробовать:
Guid empty = Guid.Empty;
query = query.Where(row => row.InvoiceId == empty);
Но на самом деле, кроме Guid
против некоторого сгенерированного компилятором класса захвата, дерево выражений для этого одинаково (оба включают lambda => BinaryExpression => MemberExpression).
Если вышеупомянутое также жалуется, попробуйте включить трассировку TSQL или включить ведение журнала ваших LINQ-провайдеров - для LINQ-to-SQL работает что-то вроде ниже (не цитируйте меня!) :
ctx.Log = Console.Out;