Posts Tagged ‘LINQ’
Linq To Sql ile Kalıtım
Linq hayatımıza girdiğinden beri görüş açımız değişti. En azından benim değişti. Önceden çekinerek baktığımız olaylar artık hayatımızın değişmez parçaları oldu. Bugün biraz derinlemesine araştırdığım Linq To Sql tarafındaki kalıtım ile ilgili makalelere ilginizi çekmek istiyorum.
Linq to Sql ile veri tabanından gelen bilgiler .Net nesnelerine dönüştürülmekte. Böylece bu iş için oluşturulmuş gerçek tipli nesneler sayesinde hem performans artışı hemde tip güvenliğine sahip oluyoruz.
Linq to Sql’in kalıtım özellikleri ile aynı tablo içerisinde tutmuş olduğumuz verileri .Net nesneleri haline getirirken bunlar için farklı nesneler oluşturulmasını sağlattırabiliyoruz. İsterseniz bunun için önce basit bir örneği düşünelim. Elimizde personel bilgilerini tutan bir tablo olsun. Bu tablo içindeki bir kolonda departman bilgisi tutulsun. Bu bilgi personelin satış, pazarlama, IT veya Yönetim departmanlarından birinde çalıştığını göstersin. En basit anlamda bu tabloyu Linq To Sql ile nesneler haline dönüştürdükten sonra bütün çalışanları tek bir tip ile ifade edildiğini göreceğiz. Ancak, Linq To Sql’in kalıtım özelliği sayesinde aslında her departman için bir Tip üretip, çekilen veride yer alan departman bilgisine göre bu tiplerden uygun olanın nesnesinin üretilmesini sağlattırabiliriz. İşte bu güzel bir özellik. İleride bununla ilgili daha detaylı bir yazı hazırlayacağım, ancak o zamana kadar aşağıdaki makalelere bir göz atabilirsiniz.
Sql Server 2008 HierarchyId Tipi
SQL Server 2008 ile beraber hayatımıza giren yeni sql tipi hierarchyid esasında eskiden beri bizim uğraşmamız gereken bir probleme çözüm oluyor. Bildiğiniz gibi hiyerarşik yapıları sql server içinde tutarken nasıl bir yol izleneceği biraz karmaşık bir yol olmuştur. o sebeple bu yeni tip bizim hayatımızı kolaylaştırıyor.
İleriki zamanlarda konu ile ilgili daha geniş bir yazı yazmayı ümit ediyorum, ancak o zamana kadar bilgi alabileceğiniz birkaç adresi sizinle paylaşacağım :
- hierarchyid (Transact-SQL) : http://technet.microsoft.com/en-us/library/bb677290.aspx
- Using hierarchyid Data Types (Database Engine) : http://technet.microsoft.com/en-us/library/bb677173.aspx
- Dmitri Nesteruk tarafından yazılmış güzel bir yazı : http://nesteruk.org/blog/post/Working-with-SQL-Server-hierarchical-data-and-Silverlight.aspx
- Working With SQL Server HierarchyId Data Type In .NET Application : http://www.thereforesystems.com/working-with-sql-server-hierarchyid-data-type-in-net-application/
- Vasco Oliveira tarafından yazılmış makale : http://blog.vascooliveira.com/sql-server-2008-hierarchyid-data-type-tutorial/
- Loading a TreeView using HierarchyID : http://www.codeproject.com/KB/cs/TreeViewFromHierarchyID.aspx
- The HierarchyID Datatype in SQL Server 2008 : http://www.sqlservercentral.com/articles/SQL+Server+2008/62204/
- SQL Server 2008 – HierarchyID – Part I : http://blogs.msdn.com/b/manisblog/archive/2007/08/17/sql-server-2008-hierarchyid.aspx
- SQL Server 2008 – HierarchyID – Part II : http://blogs.msdn.com/b/manisblog/archive/2007/08/28/sql-server-2008-hierarchyid-part-ii.aspx
- HierarchyID in Entity Framework not working : http://stackoverflow.com/questions/4316069/hierarchyid-in-entity-framework-not-working
Not: Entity Framework ve Linq To Sql ile kullanmaya çalıştım, ama problemli olduğunu görüp vazgeçtim. tam destek çıkmadan kullanmamanızı öneririm.
Entity Framework’te Include Metodu
Entity Framework Lazy Loading üzerinde çalışırken iç içe bağlantılarda problemler çıktı. Load ile çözüm bulamadığım bir anda Include Metodu ile problemim çözüldü.
Yine Northwind veri tabanınından örnek verecek olursak: Products tablosundan veriyi çektik, Order Details tablosuna ulaştık. Oradanda Orders tablosuna ulaşmak gerekiyorsa, Şu tür bir yazım çalışma zamanında hata ile karşılaşacaktır.
var product = DataContext.Products
.Include("Order_Details")
.Include("Orders")
.First( x=> x.ProductID == 10);
var orderDetails = product.Order_Details.ToArray();
Bunun sebebi, Include belirtilen tabloda yer alan Navigation Properties içerisindeki tabloları yükleyebilir. Ama alt tablolardakileri yüklemek gerekiyorsa, o zaman aralarında “.” olacak şekilde, önce üst tablo ismini yazmak, sonrada alt tablo ismini yazmak gerekir. Doğru komut şu şekilde olmalıdır.
var product = DataContext.Products
.Include("Order_Details")
.Include("Order_Details.Orders");
.First( x=> x.ProductID == 10);
var orderDetails = product.Order_Details.ToArray();
Entity Framework’te Tembellik (Lazy loading)
Entity Framework kullanmaya başladıktan sonra bazı problemler hasıl oldu. Linq to SQL’de, yüklediğimiz bir elemanın bağlı elemanlarını otomatik olarak yüklediği için ayrı bir çalışma yapmamıza gerek kalmıyordu. Mesela Elimizde Nortwind Veri tabanı varsa, bu tablodaki Products tablosundan bir elemanı şu şekilde alabiliyoruz.
var product = DataContext.Products.First( x => x.ProductID == 10);
Products Tablosu Order Details Tablosu ile bağlantılı olduğu için elimizdeki product elemanından bunun bağlı olduğu Order Details satırlarına şöyle ulaşabiliriz.
var orderDetails = product.Order_Details.ToArray();
Normalde bu şekilde orderDetails içinde veri olmasını bekleriz. Ancak EntityFramework Layz Loading(tembel yükleme) yi otomatik olarak çalıştırmamaktadır. Buda veriyi yüklemek için bizim birşeyler yapmamız gerekecektir. Bunun için 2 farklı yol kullanılabilir.
1. Include metodu ile beraber alınması istenilen tabloları belirlemek:
var product = DataContext.Products
.Include("Order_Details")
.First( x => x.ProductID == 10);
var orderDetails = product.Order_Details.ToArray();
2. Load Metodu ile lazım olduğunda verileri çekmek:
var product = DataContext.Products.First( x => x.ProductID == 10); product.Order_Details.Load(); var orderDetails = product.Order_Details.ToArray();
Böylece Order Details yüklenmiş olur.
Linq to ….
Linq dan sonra linq için ne kadar proje geliştirildiğini merak ettim. Sevgili Google da linq to şeklinde yazmaya başladığımda otomatik tamamlamada gördüğüm birkaç projeyi sizlerle paylaşmak istedim.
1. Linq to Javascript :
Javascript için linq framework’ü yazmışlar. Yoğun şekilde Javascript kullanılacaksa ve verilerle çok uğraşılması gerekiyorsa işinize yarayabilir.
Site: http://www.codeplex.com/JSLINQ
Konuya giriş için türkçe bir blog yazısı.
2. Linq to LDAP:
Active Directory veya bir ldap kaynağından veri sorgulamayı sağlayan bir yöntem.
Yöntemi açıklayan Blog yazısı.
3. DbLinq Project: Linq Provider for MySql, Oracle and PostgreSQL
Adındanda anlaşılacağı gibi linq ile desteklenmeyen veri tabanlarından en önemli 3 tanesine bağlantı sağlayan bir proje. ADO.Net Entity Framwork ile bu açıkta Microsoft tarafından kapatılmaya çalışılmakta.
Proje Sitesi: http://code2code.net/DB_Linq/
4. Linq to NHibernate:
NHibernate için Linq eklentisi nasıl yazılır. Bu blog yazısında Ayende Rahien (a.k.a. Oren Eini) bundan bahsetmektedir.
5. LINQ to Google Desktop
Google Desktop, Google’ın yerel makinada çalışan versiyonu. Dosyalarınız arasında kaybolmadan arama yapmanızı sağlamakta. Bu program için Luis Diego Fallas tarafından hazırlanmış blog yazısına bakabilirsiniz.
6. Linq to Streams (SLinq, Streaming LINQ)
Oren Novotny tarafından geliştirilen ve sürekli veri akımları üzerinde çalışan bu bileşen sayerinde gerçek zamanlı select, where ve orderby kullanılabilmektedir.
Proje Sitesi : http://www.codeplex.com/Slinq/
7. i4o – indexes for objects
Gerçekte bir linq sağlayıcısı olmayıp, linq sorgularını hızlandırmak için hazırlanmış bir linq eklentisidir. Bu eklentiyi anlatan blog yazısına buradan ulaşılabilir.
Proje Sitesi: http://www.codeplex.com/i4o
