2017-04-14 1 views
0

Actuellement, j'ai un référentiel générique comme ceci:Appliquer l'expression <Func <TEntity, bool >> dans le référentiel générique?

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

et mettre en œuvre comme ceci:

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

Parce que, RoleID apparaît dans toutes les entités, de sorte que je veux construire une expression commune dans la Dépôt générique comme ceci:

//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); 

Comment peut-on construire un filtre avec colonne inconnue de TEntity dans le référentiel générique? Ou pourrions-nous passer une chaîne de clause where pour Filter?

Mon but est que, j'ai juste besoin d'interroger des données avec une structure simple comme ça:

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

S'il vous plaît conseiller.

Merci.

+0

Le mieux serait d'implémenter une interface comme 'IHasRole {int RoleID {get; set;}}' sur toutes les entités et l'utiliser. – Evk

+0

remerciez Evk pour votre aide. –

Répondre

0

Vous pouvez modifier ces entités RoleID à l'aide d'une interface, comme:

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

Pour toutes les entités, utilisez le référentiel générique:

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

Pour les entités avec IRoleIdentifiedEntity, utilisez un autre référentiel:

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

hi Danny Chen, Mon RoleID a été créé par .edmx, c'est une colonne de table de SQL. Pouvons-nous utiliser un réflecteur pour obtenir des informations sur la propriété et y travailler? –

+0

@Langthang ce n'est pas un problème, car les classes générées à partir de .edmx sont partielles, donc vous pouvez les étendre avec l'interface sans modifier les fichiers autogénérés. – Evk

+0

@Langthang La réflexion n'aidera pas dans ce cas. Comme l'a dit Evk, vous pouvez utiliser une classe partielle. –