В общем абстрактном базовом классе я храню пару выражений, используемых для упорядочивания:
public Expression<Func<T, string>> OrderByString { get; set; }
public Expression<Func<T, int>> OrderByInt { get; set; }
Используется позже в универсальной базе class:
if (OrderByString != null)
{
results = results.OrderBy(OrderByString);
}
else if (OrderByInt != null)
{
results = results.OrderBy(OrderByInt);
}
Наконец, один из них будет установлен в конструкторе производного конкретного класса:
this.OrderByString = c => c.CustomerID;
Мне не нравится тот факт, что мне нужно иметь отдельные выражения, основанные на типе свойства, которое я хочу OrderBy. ToString не будет работать с этим свойством, потому что LINQ to Entities его не поддерживает. Мне нужен способ хранения выражения, которое выбирает любое из свойств для упорядочивания независимо от типа.
Если я попробую что-нибудь более общее, например:
public Expression<Func<T, object>> Order { get; set; }
Невозможно привести тип System.Int32 к типу System.Object. LINQ to Entities поддерживает только приведение типов примитивов модели данных сущностей.
Кроме того, если я попробую немного взломать, это тоже не сработает:
public Expression<Func<T, string>> Order { get; set; }
this.Order = c => c.OrderID.ToString();
LINQ to Entities не распознает метод 'System.String ToString ()', и этот метод нельзя преобразовать в выражение store .