Когда я пытаюсь построить Equal-Expression для объектов, реализующих IComparable, мое сравнение не удалось. Это так задумано или я что-то не так сделал?
Вот что я пробовал:
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);
}
}
==
... Вы уверены, что просматриваете правильную документацию? - person Alexei Levenkov   schedule 17.07.2020Expression.Equal
вызовет только оператор равенства. c# не требует, чтобы==
вызывалEquals()
- person Jeremy Lakeman   schedule 17.07.2020