現在、Entity Frameworkを広範囲に使用する大規模なプロジェクトに取り組んでいます。私たちが実装した機能の一部は、ユーザー指定のフィルターに基づくさまざまなデータモデルの動的クエリ(フィルター/並べ替え)です。
これを実現するために、 System.Linq.Dynamic
を使用することになりました。これにより、さまざまな方法で、 "SomeProperty.StartsWith(@P0)"
などの文字列ベースのフィルターを作成し、これらの文字列(および付随するパラメーター)を渡すことができます。 ) IQueryable<T>
( Where
など)の動的Linq拡張メソッドに追加して、データベースに対して実行され、全員が幸せになるようにします。
当時は、 表現ツリーの漠然とした概念を除いて、これを行う他の方法を知りませんでした。正直に言うと、それらを理解することができませんでした-使用したコンポーネントの逆コンパイルを数週間熟読しました動的クエリを実装するための式と私はbalked :)
さらに、私が効果的に必要な機能が
System.Linq.Dynamic
拡張機能で自分よりもはるかに賢い人々によって既に作成されているときに、私はホイールを再発明しているように感じました。
現在のコードはすべて、任意のエンティティでフィルタリング、並べ替えなどの一般化されたソリューションとして非常にうまく機能していますが、EFにますます慣れてきて、次のようなことに遭遇し始めました
そして、 System.Linq.Dynamic
が6歳近くになり、その間に実際に何も実行していなかったことを考えると、私は不思議に思い始めました。または、 いくつかの基本的なポイントを逃しましたか?
EntitySQL
を使用するには、弾丸をかじってコードベースを移動するEntitySQL
ますか? (これはSystem.Linq.Dynamic
の精神的な継承者のようなものだと思いますか、それとも間違っていますか?)
それとも私は戻ってExpression Trees
を使用する方法を学ぶ必要があります。それらは未来の道/すべてのかっこいい子供たちがそれを行う方法などだからです?私は変更のために変更のファンではなく、機能するコードが好きですが、将来のある時点で文字列ベースの動的linqが行き止まりになり、それを使用することに行き詰まるのではないかと心配しています。
誰かがSystem.Linq.Dynamic
とEntitySQL
違いを明確にするのに役立つ場合、またはExpression Trees
に移行する理由を特定できる場合は、本当に感謝しています。
プロジェクトではDynamic Linqを広範囲に使用しています...クリーンで機能しますが、コードを覗き見したり変更したりする場合は非常に複雑です。
私は、動的にLINQとEF 6の組み合わせを使用して見つけたものな問題の一つは、EF 6使用するクエリキャッシュはより速いデータの検索と動的LINQの中に内蔵されているクエリは、我々だからEF 6のこの機能を使用しない方法を実行することですクエリキャッシュを使用する場所を変更する必要があります。
これは、Dynamic Linqが新しいEFバージョンを対象としていないことを示すための小さな例にすぎません。 Dynamic Linqは、IQuerableのような型付けされていないコレクションを操作する場合に最適なソリューションですが、維持するのが非常に困難です。
型指定された環境(IQueryable)で作業していただければ幸いです。それ以外の場合は、基本的に動的LINQを変更してEF 6を実際に利用する必要があります。