2016-12-13 4 views
2

私はオブジェクトのリストを持っていて、各オブジェクトには他の値以外の型のオブジェクトのリスト(例えば子)が含まれています。私はこのリストを照会し、where句を動的に(実行時に)指定したいと思います。動的LINQクエリネストされたオブジェクト

var fselected = from f in families 
       from c in f.Children 
       where (f.FamilyAge > 15 && c.Age > 13) 
       select f; 

私はそれを行うだろう見つかった最も近いものは、NuGetでの動的LINQですが、トップレベルのオブジェクトに対する単純なwhere句を超えて、私は、ステートメントの上に行う方法上の任意の例を見つけることができません。私は考えることができる

唯一の解決策は、CのためにとFのための句は、最初のCクエリを実行する場所を別々に分割することで、その後、結果のデータセットにFクエリを実行...

+1

[文字列からLINQクエリを作成する方法は?](http://stackoverflow.com/questions/5139467/how-to-create-linq-query-from-string) – Fruchtzwerg

答えて

0

は、文字列を使用しないでくださいユーザーがデータベースに対して動的な問合せを作成できるようにすると、SQLインジェクションに脆弱になります。ユーザーがあなたのデシベルを照会できるように文字列を使用する場合代わりに、注射の問題にもかかわらず、ユーザー

public Family GetFamily(int? familyAge, int? age) 
{ 
    var families = GetAllFamilies(); 

    if(familyAge.HasValue) 
     families = families.Where(x => x.familyAge = familyAge.value); 

    if(age.HasValue) 
     families = families.Where(x => x.age = age.value); 

    return familes.ToList(); 
} 

更新

にNULL可能パラメータを公開、あなたに文字列を渡すためにDynamic Linq Libraryを使用することができますクエリ。しかし、私はこれを使用することを勧めません。

+0

返信いただきありがとうございます。私は過度に単純化されたケースを提供した。今私の家族のオブジェクトは20のプロパティを持ち、もう1つの子供は20のプロパティを持っていると想像してください。私は、ユーザーが1つの行から1つ、または2つ、またはすべてを問合せに入力できるようにしたいと考えています。このシナリオに合わせてUIを構築することは実現可能ではありません。 – AVSTR

+0

すべてのシナリオを適切にコーディングするためのあなたの怠惰は、あなたのデータベースをあなたのユーザーに開放したままにするための言い訳ではありません。それは間違っているだけです。それにもかかわらず、文字列を間違って使用するか、null可能なパラメータを正しく渡すことによって、すべてのシナリオを記述する必要があります。 – Stormhashe

+0

あなたのコードはデータベースにとって安全ですが、実行時にクエリを生成できるようにするために、手元の問題を解決することはできません。次のような単純なものを考えてみましょう。familyAge> 10 || familyAge <7 | familyAge = 8です。すべての置換を行うために必要なGetFamily関数の数はいくつですか? – AVSTR

関連する問題