2011-02-03 7 views
3

一般的なキャッシュレイヤーを構築しようとしています。私は、クエリが「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コードファースト用のキャッシュレイヤーが必要です。

答えて

3

これを行うには、実際にはExpression<Func<bool, T>>を処理します。これには、式オブジェクトの形式で必要なメタデータが含まれているため、実際にクエリで指定された内容を調べることができます。これは、LINQ-to-SQLやEntity FrameworkのようなORMが、強く型付けされたクエリ式からそれぞれのクエリレイヤー(SQLに直接LINQからSQL、Entity FrameworkからEntitySQLなどへ)への変換を実行する方法です。

この情報を入手するには2通りの方法があります。

  1. IQueryable<T>を実装します。これは、上記のようなすべてのLINQプロバイダが実装する標準のクエリインターフェイスです。
  2. タイプにWhereという名前の関数を宣言します。この関数は、引数としてExpression<Func<bool, T>>を使用します。

いずれにしても、式が得られます。コンパイルや通常のコードとしての実行を含め、好きなように実行することができます。

開始する場合は、MSDNにお越しください。たくさんの情報がありますが、あなたが持っている質問に答えることができます。もしそうでなければ、あなたは既にここに尋ねる方法を知っています!

+0

アンサーバーに感謝します。私はORMがこれを好きであることを知っています。私はまた、それがきれいできれいなSQLを生成するように、それを正しく行うためには難しい仕事を読んでいる。私はこの目標を達成するのに役立ついくつかのライブラリ/フレームワークがあることを期待していました。 – Syska

+0

@Syska:はい、独自のSQLジェネレーションエンジンを作成しようとすると、どちらも難しく、おそらく賢明ではありません。これを行うツール(L2SやEFのような)が既にあります。あなたがそうするよりも、それを上手くやることはできません!あなたはそれをすべて行う必要があるようには聞こえません。あなたは自分でクエリを検査したいと思うように思えます。あなたが使っているものと実際に何をしたいのかについてのより多くの情報を投稿すれば、私たちはあなたをさらに助けることを試みることができます。 –

+0

質問の最後にある最新情報を参照してください。 – Syska

0

独自の拡張方法Person GetById(this List<Person> list, int personId)を定義することが望ましい場合があります。キャッシュは、プログラマーが特別なメソッドを呼び出すことを覚えている間だけ有効ですが、それはもっと優れたパフォーマンスを発揮します。

関連する問題