2012-01-24 11 views
3

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(dynamic)を決定したいと思います。これは可能ですか?はいの場合は、どうですか?

答えて

2

typeof(dynamic)これは非常に興味深い結果ではないSystem.Object(これはコンパイラが実行しようとしていないもの)よりも優れていません。

ただし、returnedResult.GetType()を使用すると、ランタイムタイプを取得できます。

dynamicは型解決を実行時に置くので、C#コンパイラ自体に見合った式ツリーの型分析をせずに、何かが実際に返される前に何が返されるかは分かりません。

+0

typeof(dynamic)はコンパイル時エラーを出しています。私はTempProjectionExpression.Body.Typeで動的型の戻り値の型を決定しようとしました。コンパイラのエラーはありませんが、正しいかどうかはわかりません。 –