5

プロジェクトではMVC4とエンティティフレームワーク5を使用しており、テーブルがたくさんあります。プロジェクトの原則として、データベースからレコードを削除することはありません。各レコードにはisActiveフィールドがあり、そのフィールドがfalseの場合、削除されたと見なされます。アクティブなレコードを取得するための拡張メソッドを作成したかったので、グーグルした後、次のように作成しました。

public static IQueryable<Company> GetAll(this IQueryable<Company> source)
{
   return source.Where(p => p.isActive);
}

これで、拡張メソッドを使用して、次のようなアクティブなレコードのみを取得できます。

Context db = new Context();
db.Company.GetAll();

しかし、データベースに50以上のテーブルがあるとしましょう。テーブルごとに同じ拡張メソッドを作成するのは、良いアプローチです。すべてのテーブルに対して1つのGetAll()拡張メソッドのみを作成するためのより良い方法はありますか?実際、このインスタンスに拡張メソッドを使用するのが正しい方法かどうかさえわかりません。

誰かが私を助けて正しい方法を教えてくれませんか?コード例を手伝っていただければ幸いです。

4

2 に答える 2

2

Entity Frameworkの使用方法によって異なりますが、通常のジェネレーターに依存している場合(そして私はそう思います)、ケースはさらに難しくなり、同様のケーススタディはありませんでした。ただし、通常のPOCOクラスジェネレーターを使用する場合は、基本クラスを使用できます。CEntityこれを、他の各クラス(テーブル)の基本クラスと呼びましょう。

もうそこにいますか?いいえ、これを続けるために、私はリポジトリパターンを使用することを好みます。たとえば、そのリポジトリを汎用(CEntity)にすることができます。

public class Repository<CEntity> where CEntity : class
{
    public IQueryable<CEntity> GetAll()
    {
       return source.Where(p => p.isActive);
    }

}

そして、これはそれを使用する方法です:

Repository<Company> com = new Repository<Company>();
Repository<Employee> emp = new Repository<Employee>();

var coms = com.GetAll();    // will get all ACTIVE companies
var emps = emp.GetAll();    // will get all ACTIVE employees

これは私の頭から離れています。他に問題がある場合は、コメントとして入れてください。喜んでお手伝いします。

于 2012-12-22T16:03:22.270 に答える
1

興味深い点として、これはまさに私がデータレイヤーを実装する方法であり、素晴らしいと思います:)

私も途中でリポジトリをジャムしますが、一般的な概念はあってもなくても機能するはずです。

これは、私のブログでこの方法を使用して、同様のユースケースを実現する実際のコード例です。

https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

できることを制限しすぎずに、かなりエレガントなコードを作成できることがわかりました。私が言ったように、私はこの方法が素晴らしいと思い、その使用を本当にお勧めします.

于 2012-12-23T04:39:15.880 に答える