2010-11-30 20 views
9

Tengo una entidad A con una propiedad de navegación simple B. Para cualquier instancia determinada de A, esperamos varias miles de instancias relacionadas de B.EF crea EntityCollection, pero yo (creo que) quiero IQueryable

No hay ningún caso en el que llamo algo como:

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

En cambio, estoy solamente interesado en hacer operaciones de agregados tales como

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

Por lo que yo puedo decir, EF instancia miles de referencias a B y realiza estas operaciones en la memoria. Esto se debe a que las propiedades de navegación usan EntityCollection. En cambio, me gustaría que realice estas consultas en el nivel de SQL si es posible.

Mi presentimiento actual es que las Propiedades de navegación pueden no ser el camino correcto. No estoy apegado a EF, entonces estoy abierto a otros enfoques. Pero estaría muy interesado en saber la forma correcta de hacerlo en EF si es posible.

(estoy usando EF4.)

Respuesta

12

CreateSourceQuery parece hacer el truco.

Así que mis ejemplos serían ahora:

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

Funcionaría esto al ir a A.Where (a => a.B.CreateSourceQuery(). Any (o => o.Property == "Y")); o es un LINQ JOIN recomendado en este caso? –

-1

Hay una cosa que usted debe saber. Los miembros que se derivan de IQueryable <> se ejecutan en el servidor, no en la memoria. Los miembros que se derivan de IEnumerable <> se ejecutan en la memoria. por ejemplo

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. 

también puede recuperar los datos utilizando foreach, llamando ToArray() o ToList <>.

espera que usted entiende lo que quiero decir, y lo siento por mi Inglés :)

+0

Sí, entiendo todo eso. Sin embargo, el problema es que las propiedades de navegación son EntityCollections y no implementan IQueryable. – Larsenal

+0

Esta respuesta no se relaciona con la pregunta .. La pregunta pregunta sobre 'EntityCollection's en NavigationProperties expuestas por las entidades, mientras que su respuesta se centra en explicar cómo puede operar en' ObjectSet' expuesto por 'ObjectContext's. Simplificando, OP pregunta cómo encontrar algo en una mochila, y tu respuesta dice cómo encontrar una mochila en el maletero del coche. – quetzalcoatl

Cuestiones relacionadas