2

私は、データストレージとしてEntityFrameworkとSQLServer2008を使用するASP.NetMVC3Webサイトに取り組んでいます。また、リポジトリパターンを使用して、すべてのデータアクセスコードを1つの領域に集中させています。

私のアプリケーションには多くのユーザーがいて、すべてのユーザーが多くのプロジェクトを持つことができます。ユーザーは自分のプロジェクトにのみアクセスできる必要があります。現在、私はこのコードを持っています:

    public IQueryable<Project> All
    {
        get { 
            return context.Projects
                .Where(p => p.Owner.ID == Util.GetCurrentUserID())
                .Select(p=>p); 
        }
    }

    public Project Find(System.Guid id)
    {
        return context.Projects
                .Where(p => p.Owner.ID == Util.GetCurrentUserID())
                .FirstOrDefault();
    }

あなたが気づいた場合.Where(p => p.Owner.ID == Util.GetCurrentUserID())は重複しています。そして、私はこれらの正確な条件が散らかっている他のかなりの数の場所を持っています。

DbContextに、この条件をProjectsテーブルに移動するクエリに常に自動的に追加する方法はありますか?

何かのようなもの:

public class MyContext : DbContext
{
    public DbSet<Project> Projects
         .Where(p => p.Owner.ID == Util.GetCurrentUserID()) { get; set; }
}

また

public class MyContext : DbContext
{
    public DbSet<Project> Projects { get {
           // Insert a cast from IQuerieable to DBSet below
       return Projects
              .Where(p => p.Owner.ID == Util.GetCurrentUserID())
              .Select(p => p);
    } 
    set; }
}

質問を書いているときにUPDは、最後のバージョンがうまく機能することに気づきました-試してみる必要があります。それでも、コードの最適化とそれをよりドライにするための他のオプションを聞きたいです。

前もって感謝します!!

4

1 に答える 1

4

「WhereProject」という拡張メソッドはいつでも作成できます。次に、述語に条件を追加した後、拡張メソッドで標準の「Where」メソッドを呼び出します。

public static IEnumerable<TSource> WhereProject<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) where TSource: Project
{
     return source.Where(p=> p.Owner.ID == Util.GetCurrentUserID() && predicate);
}

必要に応じて述語をスキップするか、デフォルト値のパラメーターリストでnullとして設定し、述語を使用したくない場合はそれに応じて動作することができます。


これはおそらくあなたが望むものです、それは簡単です:

public static IEnumerable<TSource> WhereProject<TSource>(this IEnumerable<TSource> source) where TSource: Project
{
     return source.Where(p=> p.Owner.ID == Util.GetCurrentUserID());
}

編集 これらの解決策は私には正しく聞こえません。行データを1レベル上に保護する必要があると思います。私の場合は、サービスレイヤーになります。次のようなサービスクラスのメソッドについて考えてみます。

public List<Project> GetUserProjects(User user)
{
    return repo.All().Where(p => p.Owner.ID == Util.GetCurrentUserID()).ToList();
}

このように、メソッド名から、何をしているのかが非常に明確になります。特定のロジックを含めることは、リポジトリの責任ではありません。データアクセスのみを処理するためにあります。

于 2012-05-27T00:45:55.010 に答える