一般的なキャッシュレイヤーを構築しようとしています。私は、クエリが「PERSONIDを供給どうかを確認するために、上記の情報を抽出したい。ここFuncから情報を抽出する<bool, T>または類似したラムダ
list.Where(x => x.Firstname == "Syska");
:ICacheRepository
は、私は次のようしていると言う:
public class Person
{
public int PersonId { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public DateTime Added { get; set; }
}
そして、私はこのような何かを持っています"それはしなかったので、私はそれをキャッシュしたくない。
しかし、私はこのようなクエリを実行します言うことができます:...私はそれをキャッシュしたい
list.Where(x => x.PersonId == 10);
PERSONIDは私の鍵ですので。 "Person_10"のようなキーを使用して、後でキャッシュからフェッチできます。
私はExpression<Func<>>
との情報を抽出するために、その可能性を知っているが、これを行うための大きなオーバーヘッドがあるように思われる(など一定の値をコンパイルし、抽出し実行しているときに、右に解析するようにしてくださいするキャッシュの束)
フレームワークはありますか?またはこれを行ういくつかのスマート/黄金の方法ですか?
更新情報:
私はEFコードファーストCTP5を使用しています。
エンティティが自分のリポジトリからアクセスされ、データクラスの特定のプロパティでのみ照会された場合、そのオブジェクトをキャッシュに保存します。
やったときにそう:
repository.SingleOrDefault(x => x.Email == "[email protected]");
と電子メールは、「ユーザー」のエンティティのための私のキャッシュキーでそのが「電子メール」で照会されているので、私は、私のリポジトリは、それをキャッシュしたいです。
Expression<Func<User, bool>> b;
b.Body // Here I can extract most information without compiling it, to fetch what its being quried for.
私は式パーサーを作成することができないということ、そのことが、あなたが言うように、既存のSQLプロバイダが道優れている多くのエッジケースが存在します。しかし、それは私がここでやろうとしていることではありません。
私は単純にBinaryExpressionの右側を抽出したいと思います....最高と最速の方法。すべてのクエリをコンパイルするのが遅いためです。
私は、EFコードファースト用のキャッシュレイヤーが必要です。
アンサーバーに感謝します。私はORMがこれを好きであることを知っています。私はまた、それがきれいできれいなSQLを生成するように、それを正しく行うためには難しい仕事を読んでいる。私はこの目標を達成するのに役立ついくつかのライブラリ/フレームワークがあることを期待していました。 – Syska
@Syska:はい、独自のSQLジェネレーションエンジンを作成しようとすると、どちらも難しく、おそらく賢明ではありません。これを行うツール(L2SやEFのような)が既にあります。あなたがそうするよりも、それを上手くやることはできません!あなたはそれをすべて行う必要があるようには聞こえません。あなたは自分でクエリを検査したいと思うように思えます。あなたが使っているものと実際に何をしたいのかについてのより多くの情報を投稿すれば、私たちはあなたをさらに助けることを試みることができます。 –
質問の最後にある最新情報を参照してください。 – Syska