pattern mvc hamedani genericrepository framework c# entity-framework entity-framework-4 repository-pattern ef-code-first

c# - mvc - EF: incluidas otras entidades(patrón de repositorio genérico)



repository pattern c# entity framework core (3)

Estoy usando el patrón de Repositorio genérico en la parte superior del Código del Entity Framework First. Todo estaba funcionando bien hasta que necesité incluir más entidades en una consulta. Tengo que incluir una entidad con éxito, pero ahora no puedo entender cómo incluir varias entidades. Mira lo que tengo hasta ahora:

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

Lo que traté de hacer pero no funcionó fue pasar una serie de cadenas a una función, luego tratar de "agregar" las inclusiones en la parte superior de la consulta. Me preguntaba qué pasaría si llamara a GetQueryWithInclude y pasara un nombre de entidad (en realidad una propiedad de navegación) a la vez para agregar los resultados de la consulta, pero me preocupa que esto pueda duplicar los resultados de la consulta en cada llamada ... ¿Cuál crees que sería la mejor manera de hacer que esto funcione?

¡Gracias por adelantado!

ACTUALIZAR:

Aquí hay un ejemplo de lo que estoy tratando de lograr:

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


// He incluido el mínimo indispensable aquí. A continuación se muestra cómo usarlo.

IQueryable<File> 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<T> where T:class { IQueryable<T> GetAllLazyLoad(Expression<Func<T, bool>> filter, params Expression<Func<T, object>>[] children); } } namespace Msh.Intranet.Repository.GenericRepoPattern { /// <summary> /// The EF-dependent, generic repository for data access /// </summary> /// <typeparam name="T">Type of entity for this Repository.</typeparam> public class EFRepository<T> : IRepository<T> where T : class { public EFRepository(DbContext dbContext) { if (dbContext == null) throw new ArgumentNullException("dbContext"); DbContext = dbContext; DbSet = DbContext.Set<T>(); } protected DbContext DbContext { get; set; } protected DbSet<T> DbSet { get; set; } public virtual IQueryable<T> GetAllLazyLoad(Expression<Func<T, bool>> filter, params Expression<Func<T, object>>[] children) { children.ToList().ForEach(x=>DbSet.Include(x).Load()); return DbSet; } } }


Use solo la extensión Incluir en IQueryable. Está disponible en el ensamblaje EF 4.1. Si no desea hacer referencia a ese ensamblaje en las capas superiores, cree el método de extensión de envoltura en su conjunto de acceso a datos.

Aquí tienes un ejemplo:

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

Lo usará, por ejemplo, como:

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

Esta consulta cargará a todos los clientes con sus direcciones y pedidos, y cada orden contendrá sus artículos de pedido.