私はエンタープライズ環境で働いており、フロント エンド (クライアントと 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 は、ネットワークを介してサービス レイヤーを呼び出し、呼び出しのパラメーターとしてfrom
andを使用します。to
Convert は、データを自分の型に変換します。
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 を作成するにはどうすればよいですか?