我选择在LINQ Join查询中为临时投影创建一个匿名类型。我正在使用ExpressionTrees,在运行时构建查询。我不知道下面的代码是否可以帮助我创建一个临时的预测序列。
以下是执行临时投影的代码:
private Expression<Func<EntityObject, EntityObject,dynamic>> TempProjectionExpression
{
get
{
return (o, p) => new
{
o = o,
p = p
};
}
}
使用表达式树的我的加入查询如下所示。
public IQueryable<dynamic> GetQueryExpressionresults3<T, U, V>(IQueryable<T> aEntityCollection1, IQueryable<U> aEntityCollection2, Type[] _TypeArguments ,V _anonymousType, string aPropertyName)
where T : EntityObject
where U : EntityObject
{
ParameterExpression pe = Expression.Parameter(typeof(U), "o");
ParameterExpression pe1 = Expression.Parameter(typeof(T), "p");
//This should be populated from UI
Expression me = Expression.Property(pe1, typeof(T).GetProperty(aPropertyName));
//This should be populated from UI
Expression me1 = Expression.Property(pe, typeof(U).GetProperty(aPropertyName));
LambdaExpression le = Expression.Lambda<Func<T, int>>(me, new ParameterExpression[] { pe1 });
LambdaExpression le1 = Expression.Lambda<Func<U, int>>(me1, new ParameterExpression[] { pe });
_TypeArguments = new Type[] { aEntityCollection1 .ElementType, aEntityCollection2.ElementType, le.Body.Type, typeof(MovieCollections)};
//_TypeArguments = _TypeArguments.Concat(new Type[] { le.Body.Type, typeof(object) }).ToArray();
MethodCallExpression JoinCallExpression = Expression.Call(typeof(Queryable), "Join", _TypeArguments, aEntityCollection1.Expression, aEntityCollection2.Expression
, le, le1, TempProjectionExpression);
var oResult = aEntityCollection1.Provider.CreateQuery(JoinCallExpression) as IQueryable<dynamic>;
return oResult;
}
现在的问题是,我想确定TempProjectionExpression的返回类型,即typeof(动态)。这可能吗?如果是,那怎么办?
答案 0 :(得分:2)
typeof(dynamic)
不能比System.Object
(编译器甚至不会尝试做的)做得更好,这不是一个非常有趣的结果。
但是,您可以使用returnedResult.GetType()
来获取其运行时类型。
由于dynamic
将类型解析推迟到运行时,在没有对表达式树进行类型分析而无需对C#编译器本身进行类型分析的情况下,无法确定实际返回内容之前的返回值。