2017-05-31 2 views
1

Ich in diesem Moment habe ich Repository mit mehreren gets Methoden gefüllt.EF send Includes Liste zu Repository über Parameter

E.q. Get1() => cxt.Entites.Include(e => e.obj1); Get2() => cxt.Entities.Include(e => e.obj1).Include(e => e.obj2)

Und so weiter.

Gibt es eine gute Methode, Muster, eine GET-Methode zu haben, wo ich Inclues über Parameter senden kann?

Antwort

1
public virtual IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
     string includeProperties = "") 
    { 
     IQueryable<TEntity> query = dbSet; 

     if (filter != null) 
     { 
      query = query.Where(filter); 
     } 

     foreach (var includeProperty in includeProperties.Split 
      (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      query = query.Include(includeProperty); 
     } 

     if (orderBy != null) 
     { 
      return orderBy(query).ToList(); 
     } 
     else 
     { 
      return query.ToList(); 
     } 
    } 

Siehe Repository-Muster in msdn Sie

_sampleRepostiory.Get(h=>h.Id>1,null,"Employees.Departments"); 

gleichen Einschließlich mit Lambda

public virtual IEnumerable<TEntity> Get(
      Expression<Func<TEntity, bool>> filter = null, 
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
      Expression<Func<TEntity, object>>[] includes) 
     { 
      IQueryable<TEntity> query = dbSet; 

      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      if (includes != null) 
      { 
       query = includes.Aggregate(query, 
        (current, include) => current.Include(include)); 
      } 

      if (orderBy != null) 
      { 
       return orderBy(query).ToList(); 
      } 
      else 
      { 
       return query.ToList(); 
      } 
     } 

es Verbrauchen wie diese

var query = context.Customers 
       .Get(x=>x.Id>1,null, 
        c => c.Address, 
        c => c.Orders.Select(o => o.OrderItems)); 
verwenden können 210

Similar SO question

+0

Wer diese Methode verwendet, muss alle enthaltenen Eigenschaften kennen und aufzählen. Und wenn jemand beschließt, den Namen der Eigenschaft zu ändern, dann sollte er Strg + Umschalt + F durch ein Projekt ziehen und alle textuellen Verwendungen ändern. Und wenn jemand eine Eigenschaft hinzufügt, die Everywhere enthalten sollte, dann sollte er alle Verwendungen finden und ", NewProperty" zu jeder Zeichenkette hinzufügen. Klingt wie SRP-Verstoß. Ich kann nicht glauben, dass jemand wie [tdykstra] (https://github.com/tdykstra) schlechten Code schreiben kann, also sollte es etwas geben, das ich einfach nicht verstehen kann und es macht mich traurig :( –

+0

Der Code, den ich gesetzt habe ist in msdn gewesen. Ich habe eine Methode mit Überladung gemacht, die lamda-Ausdruck benutzt, wo Sie Zeichenkette nicht benötigen. Sehen Sie bitte dieses https://stackoverflow.com/questions/5376421/ef-including-other-entities- generic-repository-pattern – Eldho

+0

Es wirft Argument null Ausnahme;/ – Nerf

1

Ich habe folgendes in meinen Projekten:

public Entity[] GetAll(bool includeObj1, bool includeAllOthers) { 
    IQueryable<Entity> entity = ctx.Entities; 

    if (includeObj1) 
     entity = entity.Include(e => e.obj1); 

    if (includeAllOthers) { 
     entity = entity 
      .Include(e => e.obj2) 
      .Include(e => e.obj3) 
      .Include(e => e.obj4) 
      .Include(e => e.obj5); 
    } 

    return entity.ToArray(); 
} 

Providing Argumente wie includeObj1 und includeObj2 ein Verbraucher von Repository von der Implementierung trennt und kapselt alle Datenzugriffslogik.
Die direkte Übernahme dieser Eigenschaften in ein Repository bedeutet, dass Sie wissen, wie das Repository funktioniert, und davon ausgehen, dass es sich um eine Art ORM handelt, die Abstraktionen verwischt.

+0

Nein, es ist nicht gut. Ich habe viele Objekte einzubeziehen. Also ich will keine Methode mit 7+ Argumenten. – Nerf

+0

@Nerf Besser als 7+ Methoden mit ähnlichen Inhalten zu haben. Wenn Sie eine Methode benötigen, die nach 7 möglichen Zustandsoptionen unterschiedliche Ergebnisse liefert, dann sind 7 Argumente zu erwarten. –