2012-01-27 18 views
2

データベーステーブルのテキスト検索を実装しようとしています。私はジェネリックリポジトリを持っていて、データベースにかなりの数があるので、公開したいと思うすべてのモデルに対して派生されたものを作成する必要は本当にありません。Entity Frameworkの汎用タイプのテキスト検索

var props = typeof(T).GetProperties() 
    .Where(p => p.PropertyType == typeof(string)); 

IEnumerable<T> searched = null; 
if (!string.IsNullOrWhiteSpace(searchTerm)) 
    searched = sorted.Where(c => props 
     .Select(p => (string)p.GetValue(c, null)) 
     .Select(v => v.Contains(searchTerm)) 
     .Contains(true)); 

私はこの小さな反射によって得られたPropertyInfoさんのコレクションを供給しています:以下のように

は、だから私はとの難しさを抱えているコードがあります。おそらく高性能のアイデアではないかもしれませんが、私はまだもっと良い方法を考える必要があります。したがって、これらはstring型のすべてのプロパティ(テーブル内のすべての文字列を検索する)か、カスタムSearchable属性を持つモデル内の特定のプロパティを取得している可能性があります。

私は取得しています実行時例外がある:

非サポート例外:タイプの定数値「System.Reflection.PropertyInfo」を作成することができません。このコンテキストでは、プリミティブ型( ' Int32、String、およびGuid'など)のみがサポートされています。

私はリフレクションを使用していますが、ここで例外が発生しているのはどういうものなのかよくわかりません。誰かがこれを指摘することができれば、それは大いに評価されるだろうが、誰かがこれを行うためのよりよい方法を示唆することができればそれはすばらしいことだろう。前もって感謝します!

答えて

1

LINQクエリを実行すると、データベースで実行するSQLクエリを作成しようとしているという問題があります。例外メッセージは、SQLクエリに変換できる唯一の型であるため、プリミティブ型のみをLINQクエリで使用できることを示しています。

問題をうまく解決したい場合は、非プリミティブ型を使用してLINQクエリを拡張する前にデータベースのSQLクエリを実行するだけで済みます。

コードスニペットで変数sortedがLINQクエリであることを推測していますので、sorted.AsEnumerable()を呼び出してデータベースでSQLクエリを実行し、検索機能を実行できます。

searched = sorted.AsEnumerable() 
       .Where(c => props.Select(p => (string)p.GetValue(c, null)) 
            .Any(v => v.Contains(searchTerm))); 
+0

ご回答ありがとうございます。あなたは問題について正しいですが、解決策は私が後にしているものではありません。 where句の反映は、データベース内の列をフィルタリングするためです。私が本当に必要とするのは、これを行うためのリフレクションの代わりです。アップはすべて同じに投票した。 :) –