2017-06-29 17 views
-1

私はnet 4.5、C#およびEntity Frameworkを使用しています。私はlinqクエリの実行時にフィールドを呼び出すことができるようにしたい。Entity Framework - Linqを使用してフィールド名を呼び出す

using var(context = new SomeDataEntities()) 
{ 
    var abc = from b in context.someTable 
       where b.SomeField == 1 
       select b.AnotherField; 
} 

しかし、入力文字列パラメータに基づいてb.SomeFieldを呼び出すとします。あなたが動的にwhere句を作成したい場合は 私の現在のコードは、これを行うための最善の方法は、代わりにLINQ形式の連鎖する方法であり、

using var(context = new SomeDataEntities()) 
{ 
    var abc = from b in context.someTable 
       where b.GetType().GetProperty("SomeField").GetValue(b, null).ToString() == "test" 
       select b.AnotherField; 
} 
+0

注 - これは単なる基本例ですが、私はより複雑なクエリを実行します。 – dfresh22

+1

これは、Transact SQLクエリに変換できません。唯一の他の選択肢は、コンテンツ全体をメモリに取り込んで、リフレクションでwhere句を実行することです。プロパティの文字列を使用して動的SQL生成をサポートするライブラリを使用することもできます。 [dynamic linq](https://www.nuget.org/packages/System.Linq.Dynamic/)を参照してください。 – Igor

+0

良いコール、私は式 – dfresh22

答えて

4

です。例えば:あなたは多くの分野や、未知の番号をお持ちの場合は

using (var context = new SomeDataEntities()) 
{ 
    var query = context.Set<SomeTable>(); 
    if (field1.HasValue) 
    { 
      query = query.Where(e => e.Field1 == field1.Value); 
    } 

    if (field2.HasValue) 
    { 
      query = query.Where(e => e.Field2 == field2.Value); 
    }  

    var abc = query.Select(b => b.AnotherField); 
} 

は、SQLの生成は、あなたの最善の戦略かもしれないとDbContext.Database.SqlQuery()メソッドにアクセスすることができます。

+0

例では、フィールドをどのように呼び出しますか?または名前で呼び出す?それを定義する必要があるように見えます。 (フィールド1またはフィールド2)。 – dfresh22

+0

あなたはいくつのフィールドを持っていますか?メソッド連鎖では、それぞれの値に対して構築する必要があります。動的にする必要がある場合は、おそらくWhere()句にエントリを構築できます。 –

+0

Where句の型はExpression >です。 Expression.Equal(、)から始めることができます。https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.equal(v=vs.110).aspx –

関連する問題