I'm trying to build a search predicate dynamically but I'm having a little issue with nullable enums in my class.
This is my class and enum structure:
public class TestNullableEnumClass
{
public TestingEnum? TestEn { get; set; }
}
public enum TestingEnum
{
[Description("Item 1")]
Item1,
[Description("Item 2")]
Item2,
[Description("Item 3")]
Item3,
[Description("Item 4")]
Item4,
[Description("Item 5")]
Item5
}
I now create a list of my classes with one class with an empty enum value:
List<TestNullableEnumClass> myList = new List<TestNullableEnumClass>();
myList.Add(new TestNullableEnumClass { TestEn = TestingEnum.Item1 });
myList.Add(new TestNullableEnumClass { });
IQueryable<TestNullableEnumClass> query = myList.AsQueryable();
I now want to create an expression dynamically to filter the list where the TestNullableEnumClass has the property TestEn set to TestingEnum.Item1.
var predicate = PredicateBuilder.New<TestNullableEnumClass>();
var parameter = Expression.Parameter(typeof(TestNullableEnumClass), typeof(TestNullableEnumClass).Name);
Expression member = Expression.Property(parameter, type.Name);
var constant = Expression.Constant(TestingEnum.Item1);
var body = Expression.Equal(member, constant);
var expression = Expression.Lambda<Func<TestNullableEnumClass, bool>>(body, parameter);
predicate.Or(expression);
The above code fails on the Expression.Equal line with the following error:
{"The binary operator Equal is not defined for the types 'System.Nullable`1[ExpressionTest.TestingEnum]' and 'ExpressionTest.TestingEnum'."}
If I make the property TestEn a request field my code then works fine.
What do I need to add to get this to work with nullable enums?
I'm effectively trying to write the following dynamically:
var list = query.Where(x => x.TestEn.Equals(TestingEnum.Item1)).ToList();