Проблема вызвана операторами
public static implicit operator string(LocationId c) => c.Value;
public static explicit operator LocationId(string s) => new LocationId(s);
, поэтому выражение
l => l.Id == "DD212334234"
на самом деле
l => (string)l.Id == "DD212334234"
, что приводит к CAST в переведенном SQL.
Изначально я не смог воспроизвести его, потому что в моем тесте оба преобразования были неявными
public static implicit operator string(LocationId c) => c.Value;
public static implicit operator LocationId(string s) => new LocationId(s);
, поэтому приведенное выше выражение на самом деле
l => l.Id == (LocationId)"DD212334234"
и не вводит CAST в сгенерированном SQL.
Таким образом, решение состоит в том, чтобы либо сделать оператор LocationId
неявным, либо использовать явное приведение
l => l.Id == (LocationId)"DD212334234"
или LocationId
конструктор
l => l.Id == new LocationId("DD212334234")
или LocationId
переменная.
Или, вообще, сравнение типов клиентов.