2017-06-24 1 views
0

Nous souhaitons créer une fonction générique qui sélectionnera uniquement les colonnes requises plutôt que de renvoyer l'entité entière. Par exemple j'ai une classe de pays qui a les propriétés suivantes.Sélection de colonnes spécifiques dans une fonction de référentiel générique

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int CountryId { get; set; } 
[Required] 
public string Name { get; set; } 
public int CreatedBy {get;set;} 
public DateTime CreatedDate {get;set;} 

Et j'ai une classe respiratoire qui est commune pour toutes les entités.

public class Repository<T> : IRepository<T> where T : class 
{ 
    DbContext db; 
    DbSet<T> currentEntity; 
    public Repository(DbContext db) 
    { 
     this.db = db; 
     currentEntity = db.Set<T>(); 
    } 
    public void Add(T TEntity) 
    { 
     currentEntity.Add(TEntity); 
    } 


    public virtual List<T> GetAll() 
    { 
     return currentEntity.ToList<T>(); 
    } 
} 

Comme méthode GetAll retourne toutes les colonnes, mais je veux de ne sélectionner que Name et CountryId. Comment puis-je créer une fonction générique qui ne retournerait que les données requises?

+0

En C# cela signifierait que vous devez renvoyer des types anonymes ou dynamiques de votre référentiel. Je ne pense pas que tu devrais vouloir ça, n'est-ce pas? Il peut être préférable de retourner 'IQueryable ' au lieu de 'List ' afin que le consommateur puisse appliquer des projections efficacement. –

+0

Oui, je souhaite renvoyer des types dynamiques à partir de mon référentiel. Puis-je utiliser un délégué générique comme Action <> et le passer à la méthode Select de Linq pour créer un objet de type anonyme qui ne contiendra que deux propriétés de l'entité de pays. –

Répondre

-1

déclarer une classe DTO:

public class Getdata 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Et utiliser comme ça ..

public virtual List<Getdata> GetAll() 
{ 
    var countrys = db.currentEntity.ToList(); 
    var data = (from f in countrys 
       select new Getdata 
       { 
        Id = f.CountryId, 
        Name = f.CountryName 
       }).ToList(); 
    return data; 
} 
0

vous devez d'abord ajouté méthode générique pour référentiel générique:

public class Repository<T> : IRepository<T> where T : class 
{ 
    DbContext db; 
    DbSet<T> currentEntity; 
    public Repository(DbContext db) 
    { 
     this.db = db; 
     currentEntity = db.Set<T>(); 
    } 
    public void Add(T TEntity) 
    { 
     currentEntity.Add(TEntity); 
    } 


    public virtual List<T> GetAll() 
    { 
     return currentEntity.ToList<T>(); 
    } 

    public ICollection<TType> Get<TType>(Expression<Func<T, bool>> where, Expression<Func<T, TType>> select) where TType : class 
    { 
     return currentEntity.Where(where).Select(select).ToList(); 
    } 
} 

maintenant, vous peut appeler cette méthode. Exemple:

 public void SomeService() 
    { 
      var myData = Repository.Get(x => x.CountryId > 0, x => new {x.CountryId, x.Name}); 
      foreach(var item in myData) 
     { 
      var id = item.CountryId; 
      var name = item.Name; 
      // ... 
     } 
    } 

Et last - vous avez besoin de runtime create expression lambda et runtime get Champs obligatoires. Peut-être que ce poste vous aider: Create a lambda expression with a new anonymous type at runtime, et How do I read an attribute on a class at runtime? p.s. sory pour mon mauvais anglais =)