Как игнорировать преобразование в nullable в лямбда-выражениях? - PullRequest
0 голосов

Я пытаюсь создать синтаксический анализатор выражений для Odata, и получаю сообщение об ошибке, когда поле обнуляется.

public class UserRight
{
    public bool? active
}

public void Test(){
    Expression<Func<UserRight, bool>> expression = p => p.Active == true;
}

Он генерирует мне следующее выражение:

{p => (p.Active == Convert(True, Nullable`1))}

Но я бы хотел получить его как

{p => (p.Active == True)}

, чтобы избежать этого "преобразования".Есть ли простой способ сделать это?Потому что мой парсер готов, и я не хотел бы перестраивать его только из-за пустого поля.

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Нет, избежать этого невозможно.Вызываемый оператор принимает bool?, а не bool, поэтому аргумент должен быть bool?, иначе он не может быть скомпилирован.Существует неявное преобразование из bool в bool?, и это видно из выражения convert.Без этого неявного преобразования это не было бы допустимым выражением.

Теоретически вы могли бы вручную создать собственное выражение, которое использовало бы истинное значение логической константы, допускающее значение nullable, но нет способа заставить эту лямбду «автоматически» генерировать такое выражение, и попытка создать это новое выражение почти навернякагораздо больше работы, чем просто обращение к поставщику запросов с выражением преобразования.

0 голосов
/ 29 мая 2018

Мне, честно говоря, не нравится Nullable в логических атрибутах, больше подходит для вашего случая:

Expression<Func<UserRight, bool>> expression = p => p.Active ?? false

Это будет считать нули как ложные и решит ваш случай.

0 голосов
/ 29 мая 2018

Когда вы используете переменную nullable, вы должны проверить ее, если она имеет значение, и если она была истинной, то получите доступ к значению.что-то вроде этого:

p=> p.Active.HasValue ? p.Active.Value : false; //'== true' unnecessary

Или

p=> p.Active.GetValueOrDefault(); //the same but shorter.

Я не уверен, как работает ваш парсер, но я думаю, что это может работать.

...