IT Share you

다른 엔터티를 포함하는 EF (일반 리포지토리 패턴)

shareyou 2020. 11. 10. 22:39
반응형

다른 엔터티를 포함하는 EF (일반 리포지토리 패턴)


Entity Framework Code First 위에 Generic Repository 패턴을 사용하고 있습니다. 쿼리에 더 많은 항목을 포함해야 할 때까지 모든 것이 잘 작동했습니다. 하나의 엔터티를 성공적으로 포함해야하는데 이제 여러 엔터티를 포함하는 방법을 알 수 없습니다. 지금까지 내가 무엇을 가지고 있는지 확인하십시오.

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

내가하려고했지만 작동하지 않는 것은 문자열 배열을 함수에 전달한 다음 쿼리 위에 포함을 "추가"하는 것입니다. GetQueryWithInclude를 호출하고 한 번에 엔터티 이름 (실제로 탐색 속성)을 전달하여 쿼리 결과를 집계하면 어떻게 될지 궁금했지만 각 호출에서 쿼리 결과가 중복 될 수 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇이라고 생각하십니까?

미리 감사드립니다!

최신 정보:

다음은 내가 달성하려는 작업의 예입니다.

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

IQueryable에서 Include 확장 만 사용하십시오. EF 4.1 어셈블리에서 사용할 수 있습니다. 상위 계층에서 해당 어셈블리를 참조하지 않으려면 데이터 액세스 어셈블리에서 래퍼 확장 메서드를 만듭니다.

여기에 예가 있습니다.

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

예를 들어 다음과 같이 사용합니다.

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

이 쿼리는 주소 및 주문과 함께 모든 고객을로드하며 모든 주문에는 주문 항목이 포함됩니다.


// 여기에 최소값을 포함했습니다. 다음은 사용 방법입니다.

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

            }
        }

하드 코딩 된 ObjectQuery (T)와 작별을 고하세요.

EF> 4를 사용하는 경우 기본 제공되며 MSDN에서 DbExtensions.Include를 확인하십시오 .

참고 URL : https://stackoverflow.com/questions/5376421/ef-include-other-entities-generic-repository-pattern

반응형