1

私は 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)それは良い考えですか?

ありがとう。

4

1 に答える 1

1

Linq-To-Sql の何かが SQL に変換できない場合、例外がスローされます。プログラマーはそれを考慮し、その.AsEnumerableようなメソッドを呼び出す前に first への呼び出しを含めるようにメソッド チェーンを変更する必要があります。IMO、これは、プログラマーが知らないうちに暗黙的に行うよりも明確です (.ToListボンネットの下で呼び出すことにより)。

于 2011-08-30T00:11:58.057 に答える