1

次のコードがあります。

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つだけにしておくことができるかどうかをもう一度確認したかった.

4

3 に答える 3

1

CrudModel クラスに where 句を含む別のメソッドを用意するのはどうですか。

public IEnumerable<T> GetAll<T>(Func<T, bool> whereClause) where T : DomainBase
{
    var items = Repository.Query<T>();
    return items.Where(whereClause);
}

そして、を使用して呼び出します

List<int> intList = new List<int>() { 1 };
intList.GetAll<int>((i) => sampledict.ContainsKey(i));

ロジックを 1 つの GetAll メソッドに詰め込んで複雑にするのは適切ではないと感じました。また、CrudModel はジェネリックに見えるため、任意の条件を受け入れるジェネリック メソッドを使用する方がよいと感じました。

于 2013-04-28T05:29:28.013 に答える