次のコードがあります。
public class CrudModel<T> : ICrudModel<T> where T : DomainBase
{
public IQueryable<T> GetAll()
{
return Repository.Query<T>();
}
}
問題は、一部のオブジェクト (T) で追加のフィルターを実行する必要があるため、次のような別のメソッドを作成したことです。
public IEnumerable<TR> GetAllwithinOrg<TR>() where TR : DomainBase, IFilterable
{
var items = Repository.Query<TR>();
return FilterwithinOrg(items);
}
filter メソッドは次のようになります。
public IEnumerable<TResult> FilterwithinOrg<TResult>(IEnumerable<TResult> linked) where TResult : IFilterable
{
var dict = GetDict();
return linked.Where(r => dict.ContainsKey(r.Id));
}
IFilterable
これはすべて正常に動作しますが、問題は、メソッド 1 またはメソッド 2 を呼び出すことを覚えておく必要があることです (オブジェクトがインターフェイスをサポートしているかどうかに基づいて)
この質問で、私はこれを行うための提案を得ました:
public IQueryable<T> GetAll()
{
var items = Repository.Query<T>();
if (typeof(IFilterable).IsAssignableFrom(typeof(T)))
{
items = FilterwithinOrg(items.Cast<IFilterable>()).Cast<T>().AsQueryable();
}
return items;
}
そのため、1 つの方法で両方のユースケースをサポートできます。これは機能しているようですが、これを行うことでどのようなパフォーマンスヒットが発生するかを理解しようとしています
items.Cast<IFilterable>()).Cast<T>().AsQueryable()
それが悪い場合は、外部から2つの別々のメソッドを呼び出すことを忘れないように対処しますが、1つだけあると便利なのは明らかです。助言がありますか?
2番目のメソッドを呼び出すのを忘れた場合のバックアップとして残しておくと思いますが、外部の呼び出し元にとって簡単にするために、可能であれば1つだけにしておくことができるかどうかをもう一度確認したかった.