パラメータを IQueryable.Where に自動生成しようとしています。そのため、エンティティ フレームワーク コードの最初のデータ コンテキストからエンティティを選択でき、多くの面倒なマッピング コードを作成したり接続したりする必要はありません。
私のプロジェクトには、次のような一連の DTO が含まれています。
class FooDto
{
public string SomeProperty { get; set; }
public string SomeOtherProperty { get; set; }
}
そして、次のようなエンティティの束:-
class Foo
{
public string SomeProperty { get; set; }
public string SomeOtherProperty { get; set; }
// Some other properties here.
}
DTO には、データベース内のエンティティのサブセットを識別するために必要なフィールドが含まれています。DTO を使用して、エンティティの IQueryable をクエリします。
var result = queryable.Where(
x => x.SomeProperty == dto.SomeProperty
&& x.SomeOtherProperty == dto.SomeOtherProperty)
実際のプロパティはさまざまですが、クエリは常に「エンティティのすべてのプロパティが DTO の一致するすべてのプロパティと一致する場合」という形になります。これ以上複雑なクエリ オブジェクト機能はありません。
何十もの DTO とエンティティがあります。これらすべての述語を作成/維持し、接続することは、アーキテクチャ上の困難な問題です。現在、戦略パターンを使用しています:-
public class FooDtoSelectStrategy : ISelectStrategy<FooDto, FooEntity>
{
public Func<FooEntity, bool> GetPredicate(FooDto dto)
{
return x => x.SomeProperty == dto.SomeProperty
&& x.SomeOtherProperty == dto.SomeOtherProperty;
}
}
ninject バインディングの山と一緒ですが、すでに数十個あり、ドメインが拡大するにつれてさらに数百個を検討しています。
AutoMapper を使用して解決した、エンティティから DTO への値のマッピングに関する同様の課題がありました。
オートマッパー (または同様のツール) でこれらの述語を作成して、単一のGenericPredicateProvider<TDto, TEntity>
.