2017-06-05 10 views
0

さまざまなタイプのデータで多くの再利用が必要なため、ジェネリックを使用しています。私の主な問題はデータのクエリです。一般的なエンティティフィールド名の動的クエリ

私は特定のプロパティの値を取得するために使用することができます
public object GetPropertyValue(object src, string propertyName) 

public void test<T>(int id, T type) where T : class 
{ 
    using (var ctx = myDbContext()) 
    { 
     var myTbl = ctx.Set<T>(); 
     //this line gets the primary key of the table 
     string key = myTbl.GetPrimaryKey(ctx); 

     //this is the query I want: 
     var myResult = myTbl.FirstOrDefault(x => x.key == id); 

     //let's say if key = "UserId", then (x => x.UserId == id) or something that translates to this. 
    } 
} 

も、私は次のような方法を実装している:私はこのような何かを照会する方法を探しています。

しかし、私の問題は、LINQがメソッドの問題をクエリするために.FirstOrDefault()呼び出しの中で使用できないことです。

私は現在、代わりにこのコードを使用します。

var myResult = myTbl.ToList().FirstOrDefault(x => (int)GetPropertyValue(x, key) == id); 

データベース内の行数数の罰金ですが、データが将来的に成長するときには、パフォーマンスへの影響の多くを持っているであろう。

P.S:私はウンム

+0

あなたのコードサンプルは完全に不明です。少なくとも、正しい変数名を提供してください。なぜなら、私はあなたが 'キー'変数をどこで使うのか分からないからです。 – eocron

+0

@eocronが編集しました。 'key'変数は現在 'GetPropertyValue()'メソッドに渡されます。 –

答えて

0

最初に - myTbl.ToList().FirstOrDefault(x => (int)GetPropertyValue(x, key) == id)を使用してください。そのテーブルからすべての行を取り出し、メモリ内のidでフィルタリングするselectを生成するためです。フィルタを「式」に変換すると、Id列で選択された選択が生成されます。

var x = Expression.Parameter(typeof(T), "x"); 

string keyPropName = type.GetPrimaryKey(ctx); 
var equalExp = Expression.Equal(
    Expression.Property(x, keyPropName), 
    Expression.Constant(id) 
    ); 

var lambda = Expression.Lambda<Func<T, bool>>(equalExp, x); //x => x.Id == idValue 

var myResult = tbl.FirstOrDefault(lambda); 

は、私はあなたの GetPropertyValueGetPrimaryKeyメソッドを使用:このようなあなたのLINQの式を構築

+1

素敵なアプローチですが、私は 'id 'パラメータを' Expression.Constant(GetPropertyValue(type、keyPropName))の代わりに逃したと思います '' Expression.Constant(id) 'を使用します –

+0

そうです!そのパラメータ。申し訳ありませんが、私は答えを変更します。 –

0

最初のリバースエンジニアリングコードのEFの電動工具を使用している、あなたのコードサンプルが完全に不明です。少なくとも、正しい変数名を提供してください。なぜなら、私はあなたが 'キー'変数をどこで使うのか分からないからです。

また、オブジェクトとそれをさまざまな継承およびネスティングのプロパティとして格納および照会する場合は、リレーションベースのSQLエンジンの代わりにNoSQLデータベースを使用することを検討してください。

関連する問題