다른 엔터티를 포함하는 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
'IT Share you' 카테고리의 다른 글
Go의 컴파일 된 실행 파일 크기가 큰 이유 (0) | 2020.11.11 |
---|---|
SSIS 패키지 란 무엇이며 어떤 역할을합니까? (0) | 2020.11.11 |
드롭 다운 화살표를 숨기는 올바른 "-moz-appearance"값은 무엇입니까? (0) | 2020.11.10 |
왜 f가 float 값 뒤에 배치됩니까? (0) | 2020.11.10 |
PHP는 두 개의 연관 배열을 하나의 배열로 결합합니다. (0) | 2020.11.10 |