0

作業単位 + リポジトリ パターンで EF4.3 を使用しています。

他のメソッドのベースとして機能するメソッドがあります。コードは次のようになります。

これは私の「基本」メソッドです:

    public static IQueryable<Deal> FindActive()
    {
        var r = new ReadRepo<Deal>(Local.Items.Uow.Context);

        return r.Find(d =>
            d.ActiveFrom <= DateTime.Now &&
            (d.ActiveUntilComputed == null || d.ActiveUntilComputed > DateTime.Now) &&
            d.Published);
    }

基本メソッドを呼び出すメソッドの 1 つを次に示します。

    public static IQueryable<Deal> FindActiveByStore(int storeId)
    {
        Guard.Default(storeId, "storeId");
        return FindActive().Where(d => d.StoreId == storeId);
    }

でわかるようにFindActiveByStore、まず を呼び出しFindActive、次に をチェーンしFind()ます。FindActive の後に a が続きWhere()、2 番目の述語を追加します (用語の言い訳)。

FindActiveを使用する代わりに述語を渡すことができるWhere()かどうか、実際にパフォーマンスの点で違いがあるかどうか疑問に思いました。

このような:

FindActive(d => d.StoreId == storeId)

FindActive はすでに述語を渡しているFind()ため、両方を組み合わせる必要があります。

私が返す答えは、努力やパフォーマンスの点で「それは価値がない」という線に沿っていると思いますが、とにかく専門家に聞いてみようと思いました.

4

1 に答える 1

0

このコードを使用できます(コードの行数を減らします)

public IQueryable<Deal> FindActiveByStore(Expression<Func<Deal,bool>> predicate)
{
  var r = new ReadRepo<Deal>(Local.Items.Uow.Context);

  return r.Find(d => d.ActiveFrom <= DateTime.Now 
             && (d.ActiveUntilComputed == null || d.ActiveUntilComputed > DateTime.Now) 
             && d.Published)

             .Where(predicate);   
}
于 2012-09-07T07:48:54.187 に答える