2010-11-30 2 views
9

B 간단한 탐색 속성이있는 엔티티가 A입니다. 주어진 인스턴스 인 A에 대해 B과 관련된 몇 천 개의 인스턴스가 예상됩니다. , 나는 그런EF는 EntityCollection을 빌드하지만 IQueryable을 원한다고 생각합니다.

지금까지 내가 말할 수있는
var statY = A.B.Where(o => o.Property == "Y"); 
var statZ = A.B.Where(o => o.CreateDate > DateTime.Now.AddDays(-1)); 

로 집계 작업을하고있는 관심, 대신

foreach(var x in A.B) { ... } 

:

내가 뭔가를 호출 사례는 없다 EF는 B에 대한 수천 개의 참조를 인스턴스화하고 이러한 연산을 메모리에서 수행합니다. 탐색 속성에서 EntityCollection을 사용하기 때문입니다. 대신 가능하면 SQL 수준에서 이러한 쿼리를 수행하고 싶습니다.

내 현재는 내비게이션 속성이 올바른 방법이 아닐 수 있습니다. 나는 EF에 붙어 있지 않기 때문에 다른 접근법에 대해서 열려 있습니다. 그러나 가능하다면 EF 하에서 이것을 할 올바른 방법을 아는 것이 매우 흥미로울 것입니다.

(내가 EF4을 사용하고 있습니다.)

답변

12

CreateSourceQuery 트릭을 할 것으로 보인다.

그래서 내 예제는 이제 다음과 같습니다

var statY = A.B.CreateSourceQuery().Where(o => o.Property == "Y"); 
var statZ = A.B.CreateSourceQuery().Where(o => o.CreateDate > DateTime.Now.AddDays(-1)); 
+0

이 작업을 수행 할 때 A.Where (a => a.B.CreateSourceQuery(). Any (o => o.Property == "Y")); 또는이 경우 linq JOIN 권장입니까? –

-1

당신이 알아야 할 한 가지가있다. IQueryable <에서 파생 된 멤버는 메모리가 아닌 서버에서 실행됩니다. IEnumerable <>에서 파생 된 멤버는 메모리에서 실행됩니다. 예를

var someEntities = db.SomeEntities; <-- returns an IQueryable<> object. no data fetched. SomeEntities table may contain thousands of rows, but we are not fetching it yet, we are just building a query. 
someEntities = someEntities.Where(s => s.Id > 100 && s.Id < 200); <-- creates expression tree with where statement. The query is not executed yet and data is not fetched on the client. We just tell EF to perform a where filter when query will execute. This statement too returns an IQueryable<> object. 
var entities = someEntities.AsEnumerable(); <-- here we tell EF to execute query. now entities will be fetched and any additional linq query will be performed in memory. 

당신도> foreach 문을 사용하여 데이터, ToArray()를 호출 또는 ToList <를 가져올 수 있습니다.

내 영어에 대한 당신이 무슨 뜻인지 이해 희망, 그리고 죄송합니다 :)

+0

예, 나는 모든 것을 이해합니다. 그러나 문제는 탐색 속성이 EntityCollections이며 IQueryable을 구현하지 않는다는 것입니다. – Larsenal

+0

이 답변은 질문과 관련이 없습니다 .. 질문은 엔티티에 의해 노출 된 NavigationProperties에 대한 'EntityCollection'을 묻는 반면, 대답은'ObjectContext'에 의해 노출 된'ObjectSet'에서 어떻게 작동하는지 설명하는 데 중점을 둡니다. 간소화, OP는 배낭에있는 것을 찾는 방법을 묻습니다. 답은 자동차 트렁크에서 배낭을 찾는 방법을 알려줍니다. – quetzalcoatl

관련 문제