我正在构建表达式树:
{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;
}
在表达式中,我得到有效的lambda表达式:
{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
答案 0 :(得分:1)
经过几个小时的研究,尝试了不同的方法,我想到了Idea,试图克服这种例外。因此,我使用的解决方法是来自注释的建议:
x => x.principal_info.First()。agent_for_property_info.Select(x4 => x4)
这是我在构建表达式时添加的内容:
var result1 = Expression.Call(
typeof(Enumerable), "Select", new Type[] { elementResultType, elementResultType },
resultProperty, resultExpr);
我实际上没有找到解决方案,但是如果有人遇到这样的问题,也许这个答案可以节省他的时间。