私は IQueryable を実装していますが、これまでのところ 'Where' 呼び出し用の式ビジターのみを実装しており、他のすべては現在サポートされていません。式はネイティブ T-SQL に変換されます。もちろん、時間の経過とともに追加のメソッド呼び出しのサポートを追加する予定です。
protected override Expression VisitMethodCall(MethodCallExpression m)
{
if (m.Method.DeclaringType == typeof(Queryable) && m.Method.Name == "Where")
{
sb.Append("SELECT * FROM (");
this.Visit(m.Arguments[0]);
sb.Append(") AS T WHERE ");
LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
this.Visit(lambda.Body);
return m;
}
throw new NotSupportedException(string.Format("Method '{0}' is not supported", m.Method.Name));
}
私の「Where」サポートは遅延実行を使用しているため、私の質問は、フードの下で遅延実行が使用されていないが透過的である「Select」などの他の方法のサポートを追加することが可能かどうか、および/または良い方法であるかどうかです。 IQueryable を使用しているすべての人に。したがって、延期されたソリューションが利用可能になるまで、機能する実装があります。
例えば:
var _query = dbContext.Products
.Where(x => x.ProductName == "") // deferred execution
.Select(x => new { ... }); // cast ToList() under the hood and proceed
私の質問は 2 つあると思いますが、
1) それは可能ですか / 実装するのはどれくらい簡単ですか?
2)それは良い考えですか?
ありがとう。