2016-10-12 11 views
1

ジェネリックエンティティオブジェクトを渡して、そのクエリの最初のものを取得する方法はありますか。動的/ジェネリック型の最初の要素を取得する方法

私はすべてのテーブルでFirstOrDefault()を呼び出し、データベースの完全性のエラーをキャッチしようとしています。

たとえば、文字列パラメータで呼び出すことができるようになりました。 db.Entity("myTable").FirstOrDefault()しかし、そのような方法は存在しないようです。

以下は一般的なT試行ですが、オブジェクトにインスタンスエラーが設定されていません。

// Called with 
    //GetFirstObject<myTable>(db.myTable); 

    public static void GetFirstObject<T>(object obj) 
    { 
     MethodInfo method = typeof(IEnumerable<T>).GetMethod("FirstOrDefault"); 
     MethodInfo generic = method.MakeGenericMethod(); 
     generic.Invoke(obj, null);    
    } 
+0

この例では 'db'とは何ですか? EF DbContext? – rmorrin

+0

はい、申し訳ありません。それは私のエンティティのコンテキストです – Doomsknight

答えて

1

TEntityは、ドメインエンティティを表すクラスであると仮定すると、次の試みることができます。

public T GetFirstObject<T>() 
    where T : class 
{ 
    return context.Set<T>().FirstOrDefault(); 
} 

またフィルタ式を渡すことができますコレクションを表します。データベースタブファイルはTEntityです。そこから、LINQ(この場合はFirstOrDefault)で定義された通常のIQueryable拡張を使用できます。

これは単なる実例ですが、静的ヘルパーメソッドでこの種のロジックを定義することは通常はお勧めできません。私はあなたがこのルートを下りたいと思うならば、「ジェネリックリポジトリパターン」を研究することを提案します。これははるかに保守的です。

+0

これは素晴らしい動作します。私はセットを使用しようとしましたが、正しく動作していませんでした。 – Doomsknight

2

なぜ使用しないのですかSet<T>()

// Called with 
// GetFirstObject<myTable>(db); 

public static TEntity GetFirstObject<TEntity>(DbContext context) where TEntity : class 
{ 
    return context.Set<TEntity>().FirstOrDefault(); 
} 

context.Set<TEntity>()が返されます:

public T GetFirstObject<T>(Expression<Func<T, bool>> filterExpression) 
    where T : class 
{ 
    return context.Set<T>().FirstOrDefault(filterExpression); 
} 
+1

ありがとう、それは私のために 'どこでTEntity:クラス'なしで他の答えごとに動作しません。 +1は 'Set'を指します。 – Doomsknight

+0

@Doomsknight、よろしいですか?私はあなたの問題が解決されたことをうれしく思います。私は私の答えを編集します。 –

関連する問題