同じタイプの IQueryable を返す IQueryable の拡張メソッドを作成しましたが、少しフィルターをかけただけです。それがそのようなものだとしましょう:
public static IEnumerable<T> Foo<T>(this IEnumerable<T> source, int? howmany = null)
{
if (howmany.HasValue)
return source.Take(howmany.Value);
return source;
}
上記のメソッドを呼び出すのは簡単ですsomeLinqResult.Foo(2)
他のジェネリック クラスのインスタンスを返す他のメソッドが必要ですが、他の基本クラスが必要です(上記のソースとは異なりT
ます)。したがって、コードは次のとおりです。このメソッドは、指定された型 (IQueryable が持つ入力型以外!) のリストを返すはずですが、同じ長さ [実際の問題は NHibernate クエリ結果の変換に関するものですが、そうではありません。案件):
public static List<TTarget> Bar<TTarget,TSource>(this IEnumerable<TSource> source)
{
return new List<TTarget>(source.Count());
}
strLinqResult
がであることを考えると、IQueryable<string>
これを と呼ぶ必要がありますstrLinqResult.Bar<int,string>();
。
ポイントは、すでに定義されているメソッドを呼び出しているため、最初の型は既にわかっているにもかかわらず、両方の型を渡す必要があるというIQuerable
ことです。
呼び出すだけで十分だったのでFoo(2)
、コンパイラ Foo<string>(2)
は型を自動的に「渡す/推測」できると思いました。
では、なぜBar<int,string>();
だけでなく、2 番目のメソッドを呼び出す必要があるのBar<int>()
でしょうか。
実際のコード:
public static ListResponse<TResponse>
BuildListResponse<T,TResponse>(this IQueryable<T> iq, ListRequest request)
where TResponse: new()
{
var result = iq.ApplyListRequestParams(request).ToList().ConvertAll(x => x.TranslateTo<TResponse>());
var tcount = iq.Count();
return new ListResponse<TResponse> {
Items = result,
_TotalCount = tcount,
_PageNumber = request._PageNumber ?? 1,
};
}
ApplyListRequestParams
コード例の一種のメソッドです。オブジェクトFoo
で利用可能なページネーションと順序付けパラメータを適用するだけです。ListRequest
Items
です。public List<T> Items
_class ListResponse<T>
TranslateTo
ServiceStack のメソッドです。
NHibernate (T はドメイン モデル) によって返された上記のメソッドIQueryable<T>
は、要求パラメーター (順序付け、ページ付け) を受け取り、それらを適用してから、結果リストを からDomainModel
type の DTO オブジェクトに変換しますTResponse
。次に、リストは一般的な応答クラスにラップされます (一般的なため、多くの DTO タイプで再利用可能です)。