2011-04-14 17 views
5

Kısa bir süre önce, aracı hızlı bir şekilde almak için aracı büyük veritabanlarında kullanmak amacıyla sorgu sonuçlarını CSV biçimine indirecek LinqPad için bir araç oluşturma projesi üstlendim. Aracın dışında istediğim bir şey, Visual Studio ve LinqPad'de çalışabilmesi. Bu yüzden, eğer LinqtoSQL'i VS2010 veya LinqPad'de kullanıyor olsaydım, sonuçları bir csv dosyasına hızlıca dökebilir ve sonuçları görüntülemek için Excel'e açabilirim.LinqPad neden Özellikler yerine Alanlar oluşturur?

Projedeki en büyük engel, LinqPad'in DataContext'lerini nasıl oluşturduğuna ve Visual Studio'nun DataContext'lerini nasıl oluşturduğuna dayanıyordu. LinqPad'in nasıl yaptığını bulabildiğim en iyi bilgi here'dan geliyor. Temel olarak, projemden bulduğum şey, VS2010'un DataContexts için özellikler yaratmasıydı, ancak LinqPad, Fields'ı yaratıyordu. Yansıma kullanarak Böylece zaman:

linqpad:

dataContextType.GetProperties() //returns 0 
dataContextType.GetFields() //returns the Fields from LinqPad created DataContext 

VS 2010 LinqToSQL:

dataContextType.GetProperties() //returns the Properties from VS created DataContext 
dataContextType.GetFields() //returns 0 

Peki neden LINQPad kendi DataContexts içinde Özellikler yerine Fields kullanıyor? Visual Studio LinqToSQL kalıbını kopyalamak daha uygun olmaz mıydı?

Ben de LinqPad forum içinde aynı soru sormak için karar bir yorum dayanarak Güncelleme

.

+0

Bu, LinqPad'in yazarlarına yönlendirilmemeli midir? : D Her halükarda, hem FieldInfo hem de PropertyInfo, MemberInfo'dan devralır, böylece kodunuzu her iki durumda da (biraz çimdikleme yaparak) yeniden yazabilirsiniz. – Jonas

+0

@Jonas StackOverFlow için hala iyi bir bilgi. Her ikisi de MemberInfo'dan miras alsalar da, ikisinin de her ikisini de kullanmam gereken farklı GetValue() yöntemlerine sahipler. – jsmith

cevap

5

Bu güzel bir soru. LINQPad'in sütunları eşlemek için alanları kullanmasının ana nedeni, veritabanına bağlı sorguları destekleyen yazılan DataContext'i oluştururken performans içindir.

Özelliklerin kendileri yürütme hızından bahsetmiyoruz (aslında basit erişimcileri yürütme konusunda çok az masraf vardır ve JIT bunları satır içi hatta satır içi olabilir.) Yazma, DataSontext'i Reflection.Emit aracılığıyla oluştururken. Bir alan basitçe: bir meta veri öğesi iken, bir özellik alan tanımı, özellik tanımlaması, erişimciler için iki yöntem gerektirir (herbiri IL'nin altta yatan alanı alması/ayarlaması). Kullanıcılar, LINQPad'ı 1000 tablo ve fonksiyona kadar olan veritabanlarına yönlendirebildikleri için, bu, montajı kurmak için harcanan sürenin yanı sıra, boyutu kadar (HDD aktivitesini ve çalışma setini de arttırarak) toplayabilir.

Yansıma nesnesi modelinde PropertyInfo ve FieldInfo arasındaki birleştirme eksikliğinde ilginç bir sorunla karşılaştınız. Birleştirilmiş alanlar ve (endekslenmemiş) özellikler bir arayüz olsaydı güzel olurdu.

+0

Teşekkür ederiz! Evet, iki sınıf arasında da birleşme eksikliğini görmekten mutlu değildim. – jsmith

İlgili konular