次のデモクラスを想定しましょう。Lambda in Linq AST - なぜ異なる動作ですか?
public class Foo {
public int key1 {get; set;}
public Foo(int _key1) {
key1 = _key1;
}
}
public class Bar {
public int key2 {get; set;}
public Bar(int _key2) {
key2 = _key2;
}
}
これらは単純なLinq結合で結合されています。
Foo[]aSet = new Foo[3]{new Foo(1),new Foo(2),new Foo(3)};
Bar[]bSet = new Bar[3]{new Bar(1),new Bar(3),new Bar(5)};
Func<int,Func<Foo,bool>> VisibleLambda = w => x => x.key1 > w;
var pb = Expression.Parameter(typeof(Bar),"z");
var pf = Expression.Parameter(typeof(Foo), "y");
PropertyInfo BarId = typeof(Bar).GetProperty("key2");
PropertyInfo FooId = typeof(Foo).GetProperty("key1");
var eqexpr = Expression.Equal(Expression.Property(pb, BarId), Expression.Property(pf, FooId));
var lambdaInt = Expression.Lambda<Func<Bar, bool>>(eqexpr, pb);
var InvisibleLambda = Expression.Lambda<Func<Foo,Func<Bar, bool>>>(lambdaInt,pf);
var query = from a in aSet.Where(VisibleLambda(1))
from b in bSet.Where(InvisibleLambda.Compile()(a))
select new Tuple<Foo,Bar>(a,b);
さて、クエリは、実装の詳細は無関係である拡張
IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression)
{
if (expression == null)
throw new ArgumentNullException("expression");
return new ExpressionQueryImpl<TElement>(DataContextInfo, expression);
}
を介して実装されています。私の質問は、唯一のIQueryable由来の発現に関連しています。 2つのラムダがあります:NodeType Quote
の式の引数として1つ( "visible")が生成され、解析が非常に簡単ですが、もう1つ( "不可視")は式の第2引数として生成されますNodeType Invoke
のwhere句は、そのSQLレンダリングの観点からほとんど見えません。 なぜそれが起こっていて、回避策を講じてツアーをするのですか?
あなたは 'Expression'sについて話していますが、' Func'sでサンプルを表示しています。ケースを提示する関連情報のみを残して、投稿を更新してください。 –
@IvanStoev「目に見えない」LambdaExpressionについては、「問題」の原因であるため、より適切なLambdaExpressionのために完了しました –
今、私はあなたが何を意味するのか見ていますが、奇妙なので、私はクエリプロバイダがそれらを使用することはできません驚くことではない。たとえば、 'Queryable.Where'は' Expression> 'を期待しています。すなわち' T'パラメータをとり、 'Fool'ではなく' bool'を返すラムダです。 –