2009-05-22 13 views
0

式の構文を使用してクエリを実装する必要があります(コンパイル時に型が分からないため)。このような例クエリの場合:外部結合式ツリーを実装する方法は?

ITable p = _dataContext.GetTable(typeof(Purchases)); 
ITable c = _dataContext.GetTable(typeof(Customers)); 

LambdaExpression outerSelectorLambda = DynamicExpression.ParseLambda(typeof(Customers), null, "ID"); 
LambdaExpression innerSelectorLambda = DynamicExpression.ParseLambda(typeof(Purchases), null, "CustomerID"); 

ParameterExpression param1 = Expression.Parameter(typeof(Customers), "customer"); 
ParameterExpression param2 = Expression.Parameter(typeof(IEnumerable<Purchases>), "purchases"); 

ParameterExpression[] parameters = new ParameterExpression[] { param1, param2 }; 

LambdaExpression resultsSelectorLambda = DynamicExpression.ParseLambda(parameters, null, "New(customers as customers, purchases as purchases)"); 

MethodCallExpression joinCall = 
Expression.Call(
    typeof(Queryable), 
    "GroupJoin", 
    new Type[] { 
     typeof(Customers), 
     typeof(Purchases), 
     outerSelectorLambda.Body.Type, 
     resultsSelectorLambda.Body.Type 
    }, 
    c.Expression, 
    p.Expression, 
    Expression.Quote(outerSelectorLambda), 
    Expression.Quote(innerSelectorLambda), 
    Expression.Quote(resultsSelectorLambda) 
); 

しかし、私はこの構文を使用してクエリの残りの部分を作成する方法を見つけ出すことはできません。

​​

私はこのような一部の参加グループを実装する方法を発見しました。 誰も私を助けることができますか?

答えて

0

"join"実装をdynamic.csに貼り付け、 "GroupJoin"を動作させるためにいくつかの変更を加えました。

public static IQueryable GroupJoin(this IQueryable outer, IEnumerable inner, string outerSelector, string innerSelector, string resultsSelector, params object[] values) 
{ 
    if (inner == null) throw new ArgumentNullException("inner"); 
    if (outerSelector == null) throw new ArgumentNullException("outerSelector"); 
    if (innerSelector == null) throw new ArgumentNullException("innerSelector"); 
    if (resultsSelector == null) throw new ArgumentNullException("resultsSelctor"); 

    LambdaExpression outerSelectorLambda = DynamicExpression.ParseLambda(outer.ElementType, null, outerSelector, values); 
    LambdaExpression innerSelectorLambda = DynamicExpression.ParseLambda(inner.AsQueryable().ElementType, null, innerSelector, values); 

    Type resultType = typeof(IEnumerable<>).MakeGenericType(inner.AsQueryable().ElementType); 

    ParameterExpression[] parameters = new ParameterExpression[] 
    { 
     Expression.Parameter(outer.ElementType, "outer"), Expression.Parameter(resultType, "inner") 
    }; 
    LambdaExpression resultsSelectorLambda = DynamicExpression.ParseLambda(parameters, null, resultsSelector, values); 

    return outer.Provider.CreateQuery(
       Expression.Call(
        typeof(Queryable), "GroupJoin", 
        new Type[] { outer.ElementType, inner.AsQueryable().ElementType, outerSelectorLambda.Body.Type, resultsSelectorLambda.Body.Type }, 
        outer.Expression, inner.AsQueryable().Expression, Expression.Quote(outerSelectorLambda), Expression.Quote(innerSelectorLambda), Expression.Quote(resultsSelectorLambda))); 
} 
0

私はそれを達成するためのアプローチをたどる:

  1. は、LINQクエリの式に相当します。

  2. LINQクエリから抽出された式のToString()を取得します。

  3. 研究発現は、言及したアプローチが明確でない場合は私に戻って取得...

を入力パラメータ、型パラメータ、式の引数などを理解します。

関連する問題