によってエンティティを取得します。名前で必要なエンティティクラスを見つける方法、ToList()メソッドを呼び出してデータを返す方法反射を使ってこれを行うことはできますか?手伝って頂けますか?エンティティフレームワーク私は、次のコード(例)を持っている名前
13
A
答えて
22
Reflectionを使用して行うこともできますが、ToList()メソッドによって返されるリストのタイプがエンティティタイプごとに異なるため、ジェネリックも使用する必要があります。あなたがそうのような反射によってプロパティのゲッターにアクセスすることができます
:[ClassNameOfContext]
に対し
var enumerable = typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null);
は、CTXがのインスタンスであるクラスの名前です。これはあなたのコードから明らかにされていませんが、あなたは問題がenumerable
はobject
こととEntityType
はあなたがアクセスしているエンティティのタイプであるIEnumerable<EntityType>
にキャストする必要があるということです:-)
それを知っています。言い換えれば、あなたが渡す名前に依存します。ジェネリックを使用して型を判別すると、オブジェクトを適切にキャストでき、dynamic
を返す必要はありません。
public TEntity Get<TEntity>(string name)
{
...
と上からラインを変換:あなたが行く
ここvar enumerable = (IEnumerable<TEntity>)(typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null));
return enumerable.ToList();
!
補足説明文字列の型やプロパティの名前をタイプセーフではないため、可能な限り避けるべきです。コンパイラはそれを認識せず、リファクタリングなどのIDE機能はそれを考慮しません。ここで問題となるのは、プロパティ名は通常、エンティティタイプ名の複数形であるということです。しかし、リフレクションを使用して、型がTEntity
と一致するプロパティを見つけることができます。
var branchList = GetList<Branch>("connectionStringName", x => (Branch)x);
あなたは.AsNoTrackingを(削除)して削除することができ.ToList:私はあなたがこのように呼び出すには、この
private IEnumerable<TEntity> GetList<TEntity>(string connectionString, Func<object, T> caster)
{
using (var ctx = new DbContext(connectionString))
{
var setMethod = ctx.GetType().GetMethod("Set").MakeGenericMethod(typeof(T));
var querable = ((DbSet<object>)setMethod
.Invoke(this, null))
.AsNoTracking()
.AsQueryable();
return querable
.Select(x => caster(x))
.ToList();
}
}
のようなコードを使用することができます
0
:-)練習としてこれを残します()を呼び出すと、純粋なIQueryableが取得され、さらにクエリできます。
関連する問題
- 1. 私は、エンティティフレームワークを使用して、次のコードを持っているのDataTable
- 2. は、私は次のコード例を持っているñ
- 3. は、私は、次のXMLを持っている名前空間
- 4. Dapperの:私は次のコードを持っているテーブル名
- 5. Rubyは間違って、私は次のコードのようなコード持っているクラスの名前空間
- 6. C++ - 私はこのコードを持っている名前空間
- 7. 例外は、私は次のコードを持って反復
- 8. は、私は次のコードを持って、前後のAppDomain
- 9. コードは、私は次のコードを持っている別の1
- 10. 私は次のコードを持って、前のページ
- 11. 私は次のコードを持って、前のdiv
- 12. Angular2コードは、私は次のコードを持っているインラインテンプレートエラーに
- 13. 私は次のコードを持ってクリック
- 14. 名「URLは、」私はasp.netページで、次のコード行持ってasp.net
- 15. 私は次のコードを持っている私のルートユーザーディレクトリ
- 16. 私は、次のPHPコードを持っている私のデータベース
- 17. は、私は次のXMLの例を持っているJavaの
- 18. のWebPACK私はWebPACKの中で、次のローダを持っている[名前]
- 19. ルビーサスは、私は色を混ぜるために、次のコードを持っている名前
- 20. Logstashフィールド名は、私は、次のJSONを持っ例えば
- 21. Javaは私がプリミティブラッパークラスを持って、次のコード持ってカッコ
- 22. 、私は次のコードを持っているすべてのインスタンスメソッドパターン
- 23. 名前の変更は、順次、私はこれらのファイルを持っている名前
- 24. jqueryのは、私は次のコードを持っているのdiv
- 25. 間違い、私は次のコードを持っているのjava
- 26. Sinon私は、次の例のクラスを持っているパラメータ
- 27. は、私は次のコードを持っているJavaの
- 28. は、私は、次のコードを持っているJavaの
- 29. は、私は次のコードを持っているのコンストラクタ
- 30. レジストリのリダイレクトは、私は次のコードを持っているHKEY_CURRENT_USER
反射を使用してこれを行うにはどうすればよいですか? GetDataの戻り値の型は動的なので、ToListによって返される型は関係ありません。したがって、任意の型にすることができます – user1209216
@ user1209216 - 私は自分の答えを更新しました。 – chiccodoro
@ user1209216 - あなたは私のように問題を回避するためにダイナミックを使用しています。 'dynamic'キーワードは慎重に使うべきです。それは使用するのが妥当である非常に特定のユースケースを持っていますが、あなたのケースでは戻り値の型を強くタイプすることができます。これが好ましい方法です。 – chiccodoro