Я строю дерево выражений:
{x => x.principal_info.First (). Agent_for_property_info}
Работает как положено.
На самом деле мне нужно преобразовать его в IEnumerable
вместо ICollection
, как вы можете видеть здесь.
Вот метод, который работает:
public Expression<Func<T, IEnumerable<K>>> GetGenericExpression<T, K>(bool first = false, params string[] properties)
{
var expression = GetNavigationPropertySelector<T, K>(typeof(T), first, properties);
var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;
return expRight;
}
В выражении я получаю правильное лямбда-выражение:
{x => x.principal_info.First (). Agent_for_property_info}
Когда я кастую:
var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;
Я получаю исключение:
Unable to cast object of
type
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1,
System.Collections.Generic.ICollection`1[SomeModel]]]'
to type
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1
,System.Collections.Generic.IEnumerable`1[SomeModel]]]'.
Я знал, что ICollection
наследуется от IEnumerable
, предполагая, что это что-то довольно легко исправить.
Я много исследовал, но не нашел решения, как привести ICollection<T>
к IEnumerable<T>
или, если это вообще возможно?
Фактически, компилятор может привести его неявно, так как эти строки действительны:
var queryData1 = new QueryData<contact_info, IEnumerable<property_info>>()
{
WhereClause = expression,
SelectClause = info => info.principal_info.First().agent_for_property_info
};
Поскольку это выражение является типом ICollection
:
info => info.principal_info.First (). Agent_for_property_info