0

私はエンタープライズ環境で働いており、フロント エンド (クライアントと Web) は DB に直接アクセスするのではなく、ネットワーク経由でサービスと通信します。外部から利用可能な ASP.Net Web API の概念実証作業が開始されており、OData を使用できるように IQueryable の実装を使用しようと考えていました。問題は、Web API がネットワーク ホップ離れたサービス層にアクセスする別の "フロントエンド" になることです。つまり、IQueryable の独自の実装を作成する必要があります。

1 つの IQueryable 実装は、私が RangeQueryable と呼んでいるもので、抽象的で 3 つの汎用パラメーターを取ります。TRaw、TData、TRange。それはIQueryable<TData>

var queryable = new RangeQueryableImplementation<RawData, ConvertedData, DateTime>("Created");

前のコード行で、RawData は TRaw、ConvertedData は TData、DateTime は TRange です。

RangeQueryable にも 2 つの抽象メソッドがあります。

public abstract IEnumerable<TRaw> GetData(TRange from, TRange to);
public abstract TData Convert(TRaw raw);

GetData は、ネットワークを介してサービス レイヤーを呼び出し、呼び出しのパラメーターとしてfromandを使用します。toConvert は、データを自分の型に変換します。

TRaw はサービスが返す型、TData はフロントエンド内の型と IQueryable 内の型、TRangei は範囲型です。

したがって、これは可能です:

queryable.Where(d => d.Created < DateTime.Now && d.Created > DateTime.Now.AddDays(-5))

...または同等の OData。

ここで ExpressionVisitor の出番です。ExpressionVisitor を使用して From と To の日付を見つける必要があります。

いくつかのチュートリアルを見て、いくつかのアイデアを思いつきました。私が抱えている問題は、ExpressionVisitor を単体テストする方法がわからないことです。Queryable 拡張メソッドが作成するものと同等の Expression を作成するにはどうすればよいですか?

4

1 に答える 1

1

入力として特定の式ツリーを持つように各テストケースを記述し、(あなたの場合) 出力として特定の範囲を期待します。式ツリーの指定は、複数の方法で行うことができます: - Expression.Call などへの呼び出しを介して式ツリーを手動で作成できます (各タイプの式ノードには、それを作成する Expression タイプの静的メソッドがあります)。- 上記と同様に、拡張メソッドを使用して式ツリーを作成できます - クエリ内包表記を使用して式ツリーを作成できます (select from where 構文)。

これらのそれぞれは、最終的に式ツリーになります。拡張メソッドは最終的に Expression を呼び出します。メソッドも。それらのほとんどは、実際には Call 式を自分自身にツリーに挿入するだけです。逆アセンブラーまたはデバッガーで公開されているソース コードを確認できます。

クエリ内包構文は、拡張メソッドへの呼び出しを記述する別の方法にすぎないため、最終的には同じことになります。

単体テストでは、クエリ可能なものを実行する必要さえないので、それを作成し、式ツリーを適用し、式ビジターを実行するだけで十分です。

于 2012-09-11T08:57:02.587 に答える