Reputation: 81
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