0

式の構文を使用してクエリを実装する必要があります (コンパイル時の型がわからないため)。たとえば、次のようなクエリを実行します。

from customer in Customers
join purchase in Purchases
    on customer.ID equals purchase.CustomerID
into outerJoin
from range in outerJoin.DefaultIfEmpty()
where 
    customer.Name == "SomeName" && 
    range.Description.Contains("SomeString") &&
    customer.ID == range.CustomerID
select 
    new { Customer = customer, Purchase = range }

次のようにグループ結合部分を実装する方法を見つけました。

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)
);

しかし、この構文を使用して残りのクエリを記述する方法がわかりません。誰でも私を助けることができますか?

4

2 に答える 2

0

「結合」の実装をコピーして 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)));
}
于 2010-06-11T14:16:12.710 に答える
0

私はそれを達成するためのアプローチに従います:

  1. LINQ クエリに相当する Expression を取得します。

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

  3. 式を調べて、入力パラメーター、型パラメーター、式の引数などを理解する...

言及されたアプローチが明確でない場合は、私に連絡してください。

于 2012-01-24T14:26:56.287 に答える