2017-04-14 3 views
0

現在、私はこのような一般的なリポジトリがあります。式<Func <TEntity、bool >>を汎用リポジトリに適用しますか?

public virtual IQueryFluent<TEntity> Query(Expression<Func<TEntity, bool>> query) 
    { 
     return new QueryFluent<TEntity>(this, query); 
    } 

をそして、このように実装します。私は一般的な表現を構築したいようRoleIDは、すべてのエンティティに表示されます、ので

var obj = _repository.Query(x => x.RoleID == ID).Select().FirstOrDefault(); 

このような一般的なリポジトリ:

//Check and get RoleID if exist this column 
    PropertyInfo info = typeof(TEntity).GetProperty("RoleID"); 
    if (info != null) 
     Expression<Func<TEntity, bool>> filter = (p => p.RoleID ??? or p.info ??? == 5); 

どのように我々は一般的なリポジトリのTEntityからの未知の列でフィルタを構築することができますか?または、Filterのwhere句の文字列を渡すことはできますか?

var obj = _repository.Query().Select().FirstOrDefault(); 

教えてください:

私の目的は、私はちょうどそのような単純な構造を持つデータを照会する必要がある、ということです。

ありがとうございました。

+0

「IHasRole {int RoleID {get; set;}} 'のようなインタフェースを実装するのがベストでしょう。すべてのエンティティで使用してください。 – Evk

+0

あなたの助けにEvkに感謝します。 –

答えて

0

あなたが好きな、インタフェースを使用してRoleIDとそれらのエンティティを変更することができます、すべてのエンティティのために

interface IEntity { } 
interface IRoleIdentifiedEntity : IEntity 
{ 
    int RoleID { get; } 
} 

一般的なリポジトリを使用します。IRoleIdentifiedEntityとエンティティの場合

class GenericRepository<T> where T : IEntity 
{ 
    public IEnumerable<T> Query(Expression<Func<T, bool>> predicate) 
    { 
     throw new NotImplementedException(); 
    } 
} 

を、別のリポジトリを使用します。

class RoleIdentifiedRepositoryBase<T> : GenericRepository<T> 
    where T : IRoleIdentifiedEntity 
{ 
    public IEnumerable<T> Query(int id) 
    { 
     return Query(e => e.RoleID == id); 
    } 
} 
+0

こんにちはDanny Chen、 私のRoleIDは.edmxによって作成されました.SQLのテーブルの列です。プロパティ情報を取得してこれに取り組むためにリフレクターを使用できますか? –

+0

@Langthang .edmxから生成されるクラスは部分的であるため、問題はありません。そのため、自動生成されたファイルを変更せずにインターフェイスで拡張することができます。 – Evk

+0

この場合、@Langthang Reflectionは役に立ちません。 Evkが言ったように、部分クラスを使うことができます。 –

関連する問題