#c# #asp.net #asp.net-core
#c# #asp.net #asp.net-core
Вопрос:
У меня есть следующее выражение, в которое мне нужно добавить условие always true
string tenantId = "";
Expression<Func<MongoIdentityUser, bool>> baseFilter = t => t.IsActive == true amp;amp; t.IsApproved == true;
var constExpression = Expression.Constant(tenantId);
var paramExpression = baseFilter.Parameters[0]; //using the base filter paramater t=>
var callExp = Expression.PropertyOrField(paramExpression, "TenantId");
var ifParamIsNull = Expression.Equal(paramExpression, Expression.Constant(true));
var ifParamIsNotNull = Expression.Equal(callExp, constExpression);
var AndExp = Expression.AndAlso(baseFilter.Body, string.IsNullOrWhiteSpace(tenantId) ? ifParamIsNull : ifParamIsNotNull);
var result = Expression.Lambda<Func<MongoIdentityUser, bool>>(AndExp, paramExpression);
Console.WriteLine(result);
при запуске кода я получил следующую ошибку
Ниже приводится сообщение об исключении
Необработанное исключение. Система.Исключение InvalidOperationException: двоичный оператор Equal не определен для LMS.Entities типов.Доменные модели.Идентификация.MongoIdentityUser’ и ‘System.Логическое значение’.
Пока мне нужен следующий вывод
t => t.IsActive == true amp;amp; t.IsApproved == true amp;amp; true
Если я изменю значение true на null в приведенном ниже коде выражения, все будет нормально
var ifParamIsNull = Expression.Equal(paramExpression, Expression.Constant(null));
Комментарии:
1. В первом блоке
ifParamIsNull
присваивается выражениеt == true
. Посколькуt
этоMongoIdentityUser
, это, очевидно, не сработает. В последнем случае оно присваивается выражениюt == null
, которое является допустимым и выглядит так, как указано в имени переменной. Похоже, вы это исправили. В чем ваш вопрос?2. @madreflection на самом деле мне нужно t => true в выходных данных. Я пытаюсь создать следующее дерево выражений t => t.isActive == true amp;amp; t.IsApproved == true amp;amp; true
3. Между
t == true
иtrue
есть большая разница. ВыражениеExpression.Equal(paramExpression, Expression.Constant(true))
— это сравнениеt
сtrue
. Можете ли вы объяснить, зачем вам вообще нужно такое странное выражение? Это похоже на проблему XY.4.
amp;amp; true
это логическая идентичность, поэтому она вообще не влияет на состояние. Вам это не нужно.5. вы правы. Я использовал неправильный путь. Просто решите проблему, изменив логику.