wake-up-neo.com

EF einschließlich anderer Entitäten (generisches Repository-Muster)

Ich verwende zuerst das Muster für das generische Repository über Entity Framework-Code. Alles funktionierte einwandfrei, bis ich mehr Entitäten in eine Abfrage aufnehmen musste. Ich musste eine Entität erfolgreich einbinden, kann aber jetzt nicht herausfinden, wie mehrere Entitäten eingebunden werden sollen. Sehen Sie sich an, was ich bisher habe:

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

Was ich versuchte, aber nicht funktionierte, war, ein Array von Strings in eine Funktion zu übergeben und dann zu versuchen, die Includes an die Abfrage anzuhängen. Ich habe mich gefragt, was passiert, wenn ich GetQueryWithInclude aufgerufen und gleichzeitig einen Entitätsnamen (eigentlich eine Navigationseigenschaft) übergeben habe, um die Ergebnisse der Abfrage zu aggregieren, aber ich befürchte, dies könnte die Ergebnisse der Abfrage bei jedem Aufruf duplizieren ... Was ist Ihrer Meinung nach der beste Weg, um dies zum Laufen zu bringen?

Danke im Voraus!

PDATE:

Hier ist ein Beispiel dafür, was ich erreichen möchte:

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

Verwenden Sie nur die Include-Erweiterung für IQueryable. Es ist in EF 4.1 Assembly verfügbar. Wenn Sie nicht auf diese Assembly in Ihren oberen Ebenen verweisen möchten, erstellen Sie eine Wrapper-Erweiterungsmethode in Ihrer Datenzugriffs-Assembly.

Hier haben Sie Beispiel:

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

Sie werden es zum Beispiel wie folgt verwenden:

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

Diese Abfrage lädt alle Kunden mit ihren Adressen und Bestellungen und jede Bestellung enthält ihre Bestellpositionen.

129
Ladislav Mrnka
3
Shimmy

// Ich habe das Nötigste hier aufgenommen. Nachfolgend erfahren Sie, wie Sie es verwenden.

     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