web-dev-qa-db-fra.com

EF incluant d'autres entités (modèle de référentiel générique)

J'utilise le modèle de référentiel générique en haut de Entity Framework Code First. Tout fonctionnait bien jusqu'à ce que je devais inclure plus d'entités dans une requête. J'ai réussi à inclure une entité avec succès, mais maintenant je ne peux pas comprendre comment inclure plusieurs entités. Découvrez ce que j'ai jusqu'à présent:

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

Ce que j'ai essayé de faire, mais cela n'a pas fonctionné, a été de passer un tableau de chaînes dans une fonction, puis d'essayer d '"ajouter" les inclusions au-dessus de la requête. Je me demandais si j'appelais GetQueryWithInclude et passais un nom d'entité (en fait une propriété de navigation) à la fois pour agréger les résultats de la requête, mais je crains que cela puisse dupliquer les résultats de la requête à chaque appel ... Selon vous, quelle serait la meilleure façon de faire fonctionner cela?

Merci d'avance!

MISE À JOUR:

Voici un exemple de ce que j'essaie de réaliser:

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]);
}
67
Kassem

Utilisez uniquement l'extension Inclure sur IQueryable. Il est disponible dans EF 4.1 Assembly. Si vous ne voulez pas référencer cet assembly dans vos couches supérieures, créez une méthode d'extension d'encapsuleur dans votre assembly d'accès aux données.

Voici un exemple:

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

Vous l'utiliserez par exemple comme:

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

Cette requête chargera tous les clients avec leurs adresses et commandes et chaque commande contiendra ses articles de commande.

129
Ladislav Mrnka
3
Shimmy

// J'ai inclus le strict minimum ici. Voici comment l'utiliser.

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

            }
        }
3
hidden