LINQtoSQLまたはLINQtoEntitiesには、LINQをSQLテキスト文字列に変換する機能がすでにあります。しかし、両方のプロバイダーが必要とするdbコンテキスト(つまり、アクティブなデータベース接続を意味する)を使用せずに、アプリケーションで変換を実行する必要があります。
WHERE
次のリポジトリインターフェイスを機能させるために、LINQ式をDBコンテキストの依存関係なしに、およびORDER BY
句の同等のSQL文字列に変換したいと思います。
public interface IStore<T> where T : class
{
void Add(T item);
void Remove(T item);
void Update(T item);
T FindByID(Guid id);
//sure could use a LINQ to SQL converter!
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
IEnumerable<T> FindAll();
}
質問
これは主に、私が興味を持っている式ツリーの走査と変換です。このようなカスタムコンテキストで使用するために組み込むことができる既存のライブラリ(nuget?)を知っている人はいますか?
上記のリポジトリで機能するSQLへの式ツリーの例に似た、独自の機能する「LINQをSQLテキストに変換」ツールをすでに構築しています。これにより、次のようなコードを記述できます。
IRepository<Person> repo = new PersonRepository();
var maxWeight = 170;
var results = repo.Find(x => (x.Age > 40 || x.Age < 20) && x.Weight < maxWeight);
しかし、私のコードとそのサンプルは原始的です(そして、そのサンプル自体はLINQ to SQL dbコンテキストに依存しています)。たとえば、どちらも「LIKE」ステートメントの生成を処理しません。
考えられるすべてのLINQクエリを処理するジェネレータツールを期待したり、必要としたりすることはありません。たとえば、結合やインクルードの処理と生成については心配していません。実際、さらに20時間以内に、私自身のカスタムコードが、私が気にするすべてのケース(主に、「WHERE」および「ORDERBY」ステートメント)をカバーする可能性があります。
しかし同時に、これを行うために独自のカスタムコードを作成する必要はないと感じています。私が自分で書くのに行き詰まっている場合でも、誰かが私が反映して模倣できる特定のクラス(NHibernate、EFなど)を教えてくれるかどうか興味があります。必要な部分を見つけるためだけに大規模なツールのコードをふるいにかけるのに何時間も費やしたくないので、あなたがそれらを知っているなら、私は覗くべき特定のクラスについて尋ねています。
それは重要ではありませんが、なぜ私がLINQtoSQLやLINQtoEntitiesを使用していないのかを知りたい場合は、特定のアプリケーションではDapperなどのツールを使用することをお勧めします。
ユースケース自分でツールの作成を完了した場合でも、サードパーティのライブラリを見つけた場合でも、「 LINQtoSQL テキスト文字列」が役立つ理由は次のとおりです。
- メソッドに入力する述語には、
IRepository.Find
インテリセンスと基本的なコンパイル時チェックがあります。 - 私が提案したIStoreインターフェースは、DBアクセスまたはWebサービスアクセス用に実装できます。明確にするために、LINQ "WHERE /ORDERBY"述語をSQL"WHERE/ ORDER BY"句に変換できる場合は、...
- SQL文字列はDapperが直接使用できます。
- SQL文字列は、LINQ式とは異なり、直接DBアクセスに使用するためにWCFサービスに送信できます(それ自体はDapperを使用していない可能性があります)。
- SQL文字列は、カスタムコードを使用して逆シリアル化し、WCFサービスによってLINQステートメントに戻すことができます。 EricLippertがこれについてコメントしています。
- UIは、IQueryableメカニズムを使用して、リポジトリに提供する述語を動的に生成できます。
つまり、このようなツールは、DDDに準拠したリポジトリの「仕様」または「クエリオブジェクト」の概念を実現するのに役立ち、SQLへのEFまたはLINQに依存することなく実現します。