2017-01-02 3 views
3

背景:私は巨大なテーブルを多くのカラムと多くのエントリをデータベースに持っています。私はデータを返すいくつかのプリセットクエリを持っていますが、ユーザがクエリをさらに洗練させる(フィルタを追加する)必要があります。LinqからSQLへのユーザ生成述語

だから私の質問は以下のように、私はコードを持っている:

var dbquery = (from a in db.test where id > 100 select a); 

これはのIQueryableを返します。私が行うとき、今、私はfutherそれをフィルタリングすることができます(まだDBにクエリの実行を持っている)この

var dbquery2 = dbquery.Where(b => b.quanity > 20); 

しかし、私が本当にしたいことは、ユーザが入力にフィルタできるように、それはまだ続いて実行させるためのものですデータベース。私はPropertyDescriptorsでlookatを持っているが、彼らは常にSQL変換への適切なlinqはないと言う。 は、どのように私はこのような何かを行うことができます。

var dbqueryuser = dbquery.where(c => c.(user specified field) > 20); 

私はカスタム生成されたSQL文を実行する必要がありますか私は何とかリフレクションを使用して、有効な

Expression<Func<test,bool>> 

文を生成することができますか?

注:これは、前の質問に構築された私は、私はbasicly DBは大量のデータを返し、私が好きな(デシベル上で実行するクエリをフィルタリストを取るが、取得する必要がありますLinq to custom sql

ここに尋ねましたできるだけ多くのDB側ではなく、ユーザー側でフィルタリング取得するために)

+0

はい、あなたは '式を生成することができます> 'dynamiリフレクションではなく、 'Expression'クラスのメソッドを使用しています。あなたはもっと具体的な答えが必要な場合は、あなたのフィルタ定義のように投稿する必要がありますので、それを行うことのSOに多くの例があります。 –

答えて

1

あなたは(それがコンパイルされません)だけで、たとえば、カスタムExpressionを生成する必要があります。

var param = Expression.Parameter(typeof(Entity)); 
var property = Expression.PropertyOrField(param, propertyName); 
var greater = Expression.GreaterThan(property, Expression.Constant(20)); 
var lambda = (Expression<Func<Entity, bool>>)Expression.Lambda(greater, param); 
+0

Works :)ありがとう私はnullableことができるプロパティでそれを行うことができますか?これはNullable とSystem.Int32を比較できる演算子がないことを示しています – lesyriad

+0

これらは匹敵しません。nullableからプロパティValueを取得するか、より良いメソッドgetValueOrDefaultを呼び出すか、たとえばhier: http://stackoverflow.com/questions/586097/compare-nullable-types-in-linq-to-sql SOの表現についてはたくさんのものがあります –

+0

ありがとうございましたが、別の解決策を見つけました var testnull = Expression.TypeAs(Expression.Constant(20)、typeof(Nullable )); var greater = Expression.GreaterThan(property、testnull); – lesyriad