porti20
porti20

Reputation: 81

Expression.Equal ignors IComparable

When i try to build an Equal-Expression on objects that implements IComparable, than my comparison failed. Is this by design, or did i something wrong?

Thats what i tried:

void Main()
{
    var collection = new[]
    {
        new Comparable { B = "abc" },
        new Comparable { B = "def" },
        new Comparable { B = "ghi" }
    };
    
    var result = collection.AsQueryable().Where(CreateEqualExpression<Comparable, Comparable>(x => x, new Comparable { B = "def" }));
    Console.WriteLine(result.Count()); // returns 0
    
    result = collection.AsQueryable().Where(CreateEqualExpression<Comparable, Comparable>(x => x, collection[1]));
    Console.WriteLine(result.Count()); // returns 1
}

public static Expression<Func<TInstance, bool>> CreateEqualExpression<TInstance, TElement>(Expression<Func<TInstance, TElement>> target, TElement filter)
{
    var parameter = target.Parameters.Single();
    var expr = Expression.Equal(target.Body, Expression.Constant(filter));
    return Expression.Lambda<Func<TInstance, bool>>(expr, parameter);
}

public class Comparable : IEquatable<Comparable>, IComparable<Comparable>, IComparable
{
    public string B { get; set; }

    public bool Equals(Comparable other)
    {
        return B == other?.B;
    }

    public int CompareTo(Comparable other)
    {
        return string.Compare(B, other?.B, StringComparison.InvariantCulture);
    }

    public int CompareTo(object obj)
    {
        return CompareTo(obj as Comparable);
    }
}

Upvotes: 1

Views: 27

Answers (0)

Related Questions