2016-06-20 9 views
1

私は、Entity Frameworkコードファーストデータレイヤの一部として汎用リポジトリクラスを作成しています。すべてのエンティティは、以下で示すように、「ID」、それが動作するようid名を持っている場合は、idで単一の行を取得するには、次のC#Genericsで不明なプロパティにアクセスする方法

public T GetSingle(int id) 
    { 
     return GetAll().FirstOrDefault(x => x.ID == id); 
    } 

しかし、私は「EnityName」+ IDとしての私のエンティティの主キーに名前を付けたいと思います

return GetAll().FirstOrDefault(x => x.<EntityName>Id == id); 

動作するようにする:、などのAddressIdやApplicantIdようなコードを持ってする方法はありますか?

おかげ

+0

してください、 'ExpandoObject'を見て:それを呼び出すhttps://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx –

+1

私はそれが可能であるとは思わない、あなたのすべてのエンティティ(インターフェイスによって実施される)に同じ名前のプロパティを持つことは、確かに行く方法です。 'EntityNameId'という名前のプロパティを持つ理由がありますか?プロパティの名前は、データベース内のカラムの名前と異なる場合があります( 'Column(" nameOfTheColumn ")属性を使用してください)。 –

+0

名前を明記していただきありがとうございます。あなたが提案したルートを使用して、データ注釈を使用して列に名前を付けます。 – Massey

答えて

-3

あなたはこのために属性を使用すると、右の属性を持つプロパティを読み取ることができます。

public abstract class MyIdAttribute: Attribute 
{ 
} 

public class MyClass 
{ 
    [MyId] 
    WhatEverName {get; set;} 
} 

とあなたはそれが簡単だけで "シングルゲット" と述語

public virtual T GetSingle(Expression<Func<T, bool>> predicate) 
    { 
     if (predicate != null) 
     { 
      return context.Set<T>().Where(predicate).SingleOrDefault(); 
     } 
     else 
     { 
      throw new ArgumentNullException("Predicate value is null"); 
     } 
    } 

を渡す方法を作成行うことができますあなたの方法

public T GetSingle(int id) 
{ 
    var propertyInfos = typeof(T).GetProperties().Where(property => property.GetCustomAttributes<MyIdAttribute>().Count() > 0).ToList(); 
    if (propertyInfos.Any()) 
    { 
     foreach(T current in GetAll()) 
     { 
      object value = propertyInfos[0].GetValue(current); 
      if(value == id) 
      { 
       return current; 
      } 
     } 
    } 
} 

乾杯

トーマス

0

でそして

yourContext.GetSingle(g => g.Id == id); 
関連する問題