2017-06-24 11 views
0

エンティティ全体を返すのではなく、必須の列のみを選択する汎用関数を作成します。たとえば、私は に以下のプロパティを持つCountryクラスを持っています。ジェネリックリポジトリ関数内の特定の列を選択する

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

私はすべてのエンティティに共通の呼吸クラスを持っています。

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>(); 
    } 
} 

GetAllの方法としては、すべての列を返しているが、私は唯一のNameCountryIdを選択します。必要なデータのみを返す汎用関数を作成するにはどうすればよいですか?

+0

C#では、匿名型や動的型をリポジトリから返さなければならないことになります。私はあなたがそれを望むとは思わない、そう? 'List 'の代わりに 'IQueryable 'を返す方が良いかもしれないので、消費者は投影を効率的に適用することができます。 –

+0

はい私のリポジトリから動的な型を返したいと思います。私は、アクション<>のような汎用代理人を使用してLinqのSelectメソッドに渡して、国のエンティティの2つのプロパティだけを含む匿名型オブジェクトを作成できますか? –

答えて

-1

DTOクラスを宣言します。

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

そして、このように使用..

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

まずあなたは、一般的なリポジトリに追加ジェネリックメソッドが必要になります。

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(); 
    } 
} 

、あなたをこのメソッドと呼ばれることができます。例:

 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; 
      // ... 
     } 
    } 

最後に、実行時にラムダ式を作成し、実行時に必要なフィールドを取得する必要があります。この投稿はあなたに役立つかもしれません:Create a lambda expression with a new anonymous type at runtimeHow do I read an attribute on a class at runtime? p.s. sory for my bad english =)

関連する問題