2010-09-15 17 views
8

'Blokları' kullanarak kodlama yapıyorum ama bir IQueryable'ı, kullanmadan önce nesneye yerleştirilmeden aşağıdakilerden dönüp dönemeyeceğimi merak ediyorum. dbContext bir 'using' bloğu ile bir IQueryable Linq'den SQL sorgusuna nasıl döndürebilirim?

public IQueryable<Contact> GetContacts(string clientID) 
{ 
    using (dbDataContext db = new dbDataContext()) 
    { 
     var contacts = from _contacts in db.Contacts 
         where _contacts.ClientID == clientID 
         orderby _contacts.LastName ascending 
         select _contacts; 

     return contacts; 
    } 
} 

ben sadece 'kullanarak' bloğu kaldırmak ve Net nesneleri yönetmesine izin veya Linq erken sorgu çalıştırmak ve doldurulan nesneyi döndürmek için alabilirsiniz etmeyin.

+0

, veri içeriğini açıkça atmak için gerekli olmadığını unutmayın. yine de iyi bir soru. – fearofawhackplanet

+0

@fearofawhackplanet - er, evet öyle. Herhangi bir atılabilir nesnenin ** ** atılması gerektiği varsayılmalı ve uygun şekilde ele alınmalıdır. Açık bir bağlantıyı tutabilir, örneğin ... –

+0

@Marc: Sadece birkaç blogda okuduğum şeyi ve ScottGu ve Linq ekibinin hemen hemen tüm örneklerini izliyorum. Resmi microsoft pozisyonu, toplayabildiğim kadarıyla, kendinizi daha iyi hissettirirseniz atabilirsiniz, ama gerçekten gerekli değildir. Http://leedumond.com/blog/about-disposing-the-datacontext/ adresindeki bir kullanım imhasına ve bu soruda açıklanan ertelenmiş yürütme sorununa bir örnek olarak bakın. – fearofawhackplanet

cevap

6

sonra, ayrıca (db-sunucuda) verileri oluşturmak için beklemek istemiyorsanız: bu durumda ben IEnumerable<Contact> veya IList<Contact> olmayan yapmak için tekrar tercih ediyorum rağmen

return contacts.ToList().AsQueryable(); 

composable doğa açık. AsQueryable yaklaşımı ile hala yapıcı olabilir, ancak LINQ-to-Objects ('dan sonra kayıtları veritabanından getirdikten sonra ) aracılığıyla oluşturacaktır.

Eğer daha da oluşturmak için bekliyoruz , o zaman veri içeriğini geçirmek (ya da, eğer mümkünse, bir yukarı akış IQueryable<something>) içine yöntem ve arayan kullanım kolu izin vermelidir:

public IQueryable<Contact> GetContacts(dbDataContext db, string clientID) 
{ 
    return from _contacts in db.Contacts 
      where _contacts.ClientID == clientID 
      orderby _contacts.LastName ascending 
      select _contacts; 
} 
+0

@IckleMonkey - orada en önemli olan * beton * türüdür, ancak 'IList ''ün belirgin bir avantajı, '.Count' vb. (Ve bir indeksleyici) açığa çıkararak erişimi daha kolay hale getirmesidir.Ancak IList 've' IEnumerable 'arasına bakılmaksızın, hala * bir' Liste ', bellek kullanımı bağımsızdır. Veya daha özlü bir cevap için: 'IList kullanın ' –

-1

Eğer

public IQueryable<Contact> GetContacts(string clientID) 
{ 
    IQueryable contacts; 
    using (dbDataContext db = new dbDataContext()) 
    { 
     contacts = from _contacts in db.Contacts 
         where _contacts.ClientID == clientID 
         orderby _contacts.LastName ascending 
         select _contacts; 


    } 

    return contacts; 
} 
+2

Bu yardımcı olmayacak - LINQ sorgularının ertelenmiş yürütülmesi, db bağlamının hala' GetEnumerator()' temel sorgusunda çağrılmadan önce atıldığı anlamına gelir. Yani işveren yok. –

0

bağlam da sınıfın üyesi örneğini nesne yapabilir böyle bir şey yapabilir? Eğer yapabilirseniz, çağrıyı gerçekte siz döndüğünüz IQueryable örneğinin altında yatan numaralandırıcıya dokunana dek sorguyu çalıştırmaya erteleyebilirsiniz. Bu ne yapmak istediğinize bağlıdır. IQueryable'i bu yöntemden döndürmeniz gerekiyor mu, yoksa IEnumerable ile ilgili bir şeyler yapabilir misiniz?

+0

IEnumerable ile gideceğim, üye örneği yöntemini kullanırsam, sınıfım 'kullanma' bloğu olarak kullanılırsa aynı soruna girebilir ve bunun dışında kalan verilere erişmek istiyorum. Önerin için teşekkürler. – polom1nt

0

IQueryable sonuç kümesindeki iletişim nesnesi örneği, kullanım bloğu içinde kullanılan veri içeriğinin referansını tutacaktır ve istemci kodunda beklendiği gibi çalışacaktır. Ortaya çıkan IQueryable örneğinde ertelenmiş SQL işlemleri gerçekleştirebilecek ve normal olarak diğer IQUTERAL işlemleri gerçekleştirebileceksiniz.

+1

Denediğimde, 'Dispose sonra DataContext'e erişiliyorum'. – polom1nt

İlgili konular