1

IQueryable을 반환하는 지연된 GetAll 메서드로 저장소 패턴을 사용하고 데이터베이스에서 개체를 가져 오는 경우가 있습니다. 그러나 나는 또한 게으른로드 된 개체 (쿼리)에 포함될 동적 개체를 빌드해야합니다.IQueryable 및 Lazy Loading 및 Eager Loading 섞기

게으른로드 된 IQueryable에 빌드 된 개체를 추가하고 지연된 이점을 계속 유지할 수 있습니까? 예를

public override IQueryable<Foo> GetAll() 
{ 
    return _entities; // lazy loaded 
} 

public override IQueryable<Foo> GetAllPlusDynamic() 
{ 
    var entities = GetAll(); 
    foreach(var d in GetAllDynamic()) 
    { 
     entities.Add(d); // eagerly loaded 
    } 
    return entities; 
} 
+0

솔직히 질문을 이해할 수 없습니다. "열심히로드 된" "동적 인 대상"은 무엇입니까? 'Include (customer => customer.Orders)'와 같이 어떤 종류의'Include' 표현을 의미합니까? 구체적인 예를들 수 있습니까? – Slauma

+0

@Slauma 제 이해는 Op가 * GetAllPlusDynamic *을 데이터베이스 콜렉션 * plus * 다른 콜렉션을 쿼리하기를 원했던 것입니다 ... – McGarnagle

+0

예, 기본적으로 오브젝트 세트에 대한 데이터베이스를 조회 한 후 다른 데이터 소스 (이 경우에는 서비스) 그리고 일련의 객체를 빌드하십시오. –

답변

1

위해 나는 (

예, 기본적으로 개체의 집합에 대한 데이터베이스를 조회하고 조회 다른 데이터 소스 ... 내가 제대로하지만 댓글에 다스 려 당신을 이해한다면 확실치 이 경우 서비스)를 호출하고 개체 집합을 만듭니다.

... 나는 불가능하다고 말하고 싶습니다.

Entity Framework (LINQ to Entities)와 함께 사용되는 IQueryable<T> 유형의 개체는 기본적으로 기본 데이터 저장소에서 실행할 수있는 쿼리에 대한 설명으로, 일반적으로 SQL로 변환되는 추상 설명 (표현식 트리)입니다.

이러한 쿼리 설명의 모든 부분 - where 표현식, select 표현식, Any(...) 표현식 등은 데이터 저장소의 기본 언어 (SQL)로 변환 할 수 있어야합니다. 특히 데이터베이스가 이해하고 수행 할 수없는 표현식에 서비스 호출과 같은 일부 메소드 호출을 포함시키는 것은 불가능합니다.

IQueryable<T>은 기본 "제공자"를 알고 있습니다. 이 공급자는 IQueryable<T> 개체의 식 트리 보유를 "무언가"로 변환 할 책임이 있습니다 (예 : SQL Server에서 사용되는 T-SQL 또는 MySQL 또는 Oracle에서 사용되는 SQL 언어). 어떻게 든 서비스 호출과 데이터베이스 쿼리를 수행 할 수있는 자체 공급자를 작성할 수 있다고 생각합니다. 그러나 나는 이것이 쉬운 일이 아니라고 생각한다.

Entity Framework 용 표준 SQL 공급자를 사용하면 데이터베이스 쿼리를 수행하고 서로 하나씩 서비스를 호출해야합니다. 쿼리를 실행하고 메모리에서 엔터티를 구체화 한 다음 각 엔터티에 대한 결과 컬렉션에서 서비스 호출을 실행해야합니다.