2

エンティティ フレームワークを使用するデータ アクセス クラスに次のメソッドがあります。

public static IEnumerable<entityType> GetWhere(Func<entityType, bool> wherePredicate)
{
    using (DataEntities db = new DataEntities())
    {
        var query = (wherePredicate != null)
            ? db.Set<entityType>().Where(wherePredicate).ToList()
            : db.Set<entityType>().ToList();                    
        return query;
    }
}

これは、すべてのレイヤーでエンティティを使用すると正常に機能します...ただし、DTO クラスの使用に移行しようとしており、次のようなことをしたいと考えています。

public static IEnumerable<EntityTypeDTO> GetWhere(Func<EntityTypeDTO, bool> wherePredicate)
{
    //call a method here which will convert Func<EntityTypeDTO,bool> to 
    // Func<EntityType,bool>

    using (DataEntities db = new DataEntities())
    {
        var query = new List<EntityType>();
        if (wherePredicate == null)
        {
            query = db.Set<EntityType>().ToList();
        }
        else
        {   
            query = (wherePredicate != null)
                ? db.Set<EntityType>().Where(wherePredicate).AsQueryable<EntityType>().ToList()
                : db.Set<EntityType>().ToList();
        }
        List<EntityTypeDTO> result = new List<EntityTypeDTO>();
        foreach(EntityType item in query)
        {
            result.Add(item.ToDTO());
        }

        return result;
    }
}

基本的に、Func を Func に変換するメソッドが必要です。

Func を式ツリーに分解してから、entityType で何らかの方法で再構築する必要があると思いますか?

プレゼンテーション層が式クエリを渡すだけにするためにこれを行いたいですか?

何か基本的なことが欠けているのでしょうか、それとも、クエリの詳細を知らなくても DTO からデータ アクセス クラスにクエリを渡すことができる、より簡単な設計パターンはありますか?

DTO をエンティティから継承させようとしましたが、どちらも機能していないようです。

私が見逃しているより良いデザインパターンがあれば、ポインターが欲しいので、そこから調査できます...

4

2 に答える 2

0

これを回答として掲載します。素早い回答をしてくれたダンに感謝します。あなたが言っていることを見て、クラスのクエリ/フィルターセットを書くことができます。たとえば、次のコードを見てください。

GetProducts().GetProductsInCategory().GetProductsWithinPriceRange(minPrice, maxPrice);

このコードは次のように実行されます: Get Products はテーブル内のすべての製品を取得し、残りの関数は結果をフィルタリングします。すべてのクエリがこのように実行されると、データアクセスレイヤー/ DB サーバー接続に大きな負荷がかかる可能性があります...わかりません。

また

私が取り組む代替案も次のとおりです。各関数がLinq式を作成する場合、次のように組み合わせることができます。複数のlinqクエリを1つの結果セットに結合するにはどうすればよいですか? これにより、フィルター処理された結果セットをデータベースから返すことができる方法でこれを行うことができます。

いずれにせよ、これを回答済みとしてマークしています。詳細がわかり次第更新します。

于 2016-06-27T09:55:43.977 に答える