EF Compreso altre quadro (modello di deposito generico)

Sto usando il modello di repository generico sopra a Entity Framework Code First. Tutto funzionava bene fino a quando non avevo bisogno di includere più entity framework in una query. Devo includere un’entity framework con successo, ma ora non riesco a capire come includere più quadro. Scopri cosa ho ottenuto finora:

public IQueryable GetQuery() where TEntity : class { var entityName = GetEntityName(); return _objectContext.CreateQuery(entityName); } public IList GetQueryWithInclude(string toInclude) where TEntity : class { var entityName = GetEntityName(); return _objectContext.CreateQuery(entityName).Include(toInclude).ToList(); } private string GetEntityName() where TEntity : class { return string.Format("{0}.{1}", _objectContext.DefaultContainerName, _pluralizer.Pluralize(typeof(TEntity).Name)); } 

Quello che ho cercato di fare ma non ha funzionato è stato passare in una serie di stringhe in una funzione, quindi provare ad “aggiungere” gli include in cima alla query. Mi chiedevo cosa sarebbe successo se avessi chiamato GetQueryWithInclude e passato un nome di quadro (in realtà una proprietà di navigazione) alla volta per aggregare i risultati della query, ma temo che questo potrebbe duplicare i risultati della query su ogni chiamata … Quale pensi che sarebbe il modo migliore per farlo funzionare?

Grazie in anticipo!

AGGIORNARE:

Ecco un esempio di ciò che sto cercando di ottenere:

 public IQueryable GetQueryWithIncludes(string[] otherEntities) { var entityName = GetEntityName(); //now loop over the otherEntities array //and append Include extensions to the query //so inside the loop, something like: _objectContext.GetQuery(entityName).Include(otherEntities[index]); } 

Utilizza solo l’estensione Includi su IQueryable. È disponibile nell’assemblaggio EF 4.1. Se non si desidera fare riferimento a quell’assieme nei livelli superiori, creare il metodo di estensione wrapper nel proprio assieme di accesso ai dati.

Ecco un esempio:

 public static IQueryable IncludeMultiple(this IQueryable query, params Expression>[] includes) where T : class { if (includes != null) { query = includes.Aggregate(query, (current, include) => current.Include(include)); } return query; } 

Lo userai per esempio come:

 var query = context.Customers .IncludeMultiple( c => c.Address, c => c.Orders.Select(o => o.OrderItems)); 

Questa query caricherà tutti i clienti con gli indirizzi e gli ordini e ogni ordine conterrà gli articoli dell’ordine.

// Ho incluso il minimo indispensabile qui. Di seguito è come usarlo.

  IQueryable xg= UnitOfWork.Files.GetAllLazyLoad(d => d.FileId == 1, r => r.FileCategory); //where r.FileCategory is a navigational property. //Interface namespace Msh.Intranet.Repository.GenericRepoPattern { public interface IRepository where T:class { IQueryable GetAllLazyLoad(Expression> filter, params Expression>[] children); } } namespace Msh.Intranet.Repository.GenericRepoPattern { ///  /// The EF-dependent, generic repository for data access ///  /// Type of entity for this Repository. public class EFRepository : IRepository where T : class { public EFRepository(DbContext dbContext) { if (dbContext == null) throw new ArgumentNullException("dbContext"); DbContext = dbContext; DbSet = DbContext.Set(); } protected DbContext DbContext { get; set; } protected DbSet DbSet { get; set; } public virtual IQueryable GetAllLazyLoad(Expression> filter, params Expression>[] children) { children.ToList().ForEach(x=>DbSet.Include(x).Load()); return DbSet; } } } 

Dì addio a ObjectQuery con hardcoded (T) .Include le chiamate

Se utilizzi EF> 4, significa che è incorporato, controlla DbExtensions.Include su MSDN .