2010-11-30 11 views
9

Basit bir gezinme özelliğine sahip A var. B. Herhangi bir A örneği için, B'un birkaç ilgili bin örneğini bekliyoruz. Ben böyleEF, EntityCollection'u oluşturur, ancak ben (düşünün) IQueryable'i istiyorum

Bildiğim kadarıyla söyleyebilirim
var statY = A.B.Where(o => o.Property == "Y"); 
var statZ = A.B.Where(o => o.CreateDate > DateTime.Now.AddDays(-1)); 

olarak agrega işlemleri yaparken sadece ilgileniyorum, yerine

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

:

ben gibi bir şey diyoruz dava yok EF, B'ye binlerce referans gönderir ve bu işlemleri hafızada yapar. Bunun nedeni, gezinme özelliklerinin EntityCollection kullanmasıdır. Bunun yerine, mümkünse bu sorguları SQL düzeyinde gerçekleştirmeyi isterim.

Geçerli önsezim, Gezinme Özellikleri'nin gitmek için doğru yol olmadığı olabilir. EF'e bağlı değilim, bu yüzden diğer yaklaşımlara açığım. Fakat eğer mümkünse bunu EF altında yapmanın doğru yolunu bilmek isterim.

(ı EF4'ü kullanıyorum.)

cevap

12

CreateSourceQuery hileye neden olabilir.

Yani benim örnekler şimdi şöyle olacaktır:

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

Bu, A.Where (a => a.B.CreateSourceQuery() öğesinden geçerken işe yarar mı? (Herhangi bir = (o => o.Property == "Y")); veya bu durumda bir JOIN önerilir mi? –

-1

Bilmeniz gereken bir şey var. IQueryable <> 'dan türetilen üyeler, bellekte değil sunucuda yürütülür. IEnumerable <> 'dan türetilen üyeler bellekte yürütülür. örnek

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. 

için de> foreach kullanarak verileri ToArray arayarak() veya ToList < getirebilir.

benim İngiliz ne demek istediğimi anlamak umuyoruz, ve üzgünüm :)

+0

Evet, bütün anlıyoruz. Ancak, sorun navigasyon özelliklerinin EntityCollections olmasıdır ve IQueryable uygulamamasıdır. – Larsenal

+0

Bu yanıt soruyla ilgili değil. Soru, nesneler tarafından gösterilen NavigationProperties öğesindeki "EntityCollection" hakkında soru soruyor, yanıtınız ise ObjectContext işleviyle gösterilen "ObjectSet" üzerinde nasıl çalışabileceğinizi açıklamaya odaklanıyor. Basitleştiren OP bir sırt çantasındaki bir şeyi nasıl bulacağınızı sorar ve cevabınız araba bagajında ​​bir sırt çantası nasıl bulacağınızı söyler. – quetzalcoatl

İlgili konular