|
Vaka 1 : Sorgularda In Desteği
|
|
Açıklama
|
|
Ado.Net Entity Framework 4.0 öncesindeki sürümde SQL tarafında In anahtar kelimesine dönüşebilecek sorgu desteği bulunmamaktadır. 4.0 versiyonunda In' e dönüştürülebilme desteği belirli ölçüde bulunmaktadır. Aşağıdaki LINQ sorgusuna göre, Berlin ve Paris şehirlerinde yer alan müşteriler elde edilmeye çalışılmaktadır. 4.0 öncesi sürümde bu tip bir LINQ sorgusunda yer alan Contains metodunun SQL tarafına dönüştürülemediği görülür. Ancak 4.0 versiyonunda SQL tarafına In olarak aktarılması sağlanmaktadır.
|
|
Önceki Versiyon - LINQ Sorgusu
|
|
string[] cityNames = { "Berlin", "Paris" };
var result = from customer in entites.Customer where cityNames.Contains(customer.City) select customer;
foreach (var r in result) { Console.WriteLine("{0} {1} {2}", r.Email, r.FirstName, r.LastName); }
|
|
Önceki Versiyon - SQL Sorgusu
|
|
Bir SQL sorgusu yürütülememektedir nitekim çalışma zamanında aşağıdaki Exception mesajı alınacaktır.

|
|
4.0 - LINQ Sorgusu
|
|
string[] cityNames = { "Berlin", "Paris" };
var result = from customer in entites.Customers where cityNames.Contains(customer.City) select customer;
foreach (var r in result) { Console.WriteLine("{0} {1} {2}", r.Email, r.FirstName, r.LastName); }
|
|
4.0 - SQL Sorgusu
|
|
SELECT [Extent1].[CustomerId] AS [CustomerId], [Extent1].[FirstName] AS [FirstName], [Extent1].[LastName] AS [LastName], [Extent1].[Company] AS [Company], [Extent1].[Address] AS [Address], [Extent1].[City] AS [City], [Extent1].[State] AS [State], [Extent1].[Country] AS [Country], [Extent1].[PostalCode] AS [PostalCode], [Extent1].[Phone] AS [Phone], [Extent1].[Fax] AS [Fax], [Extent1].[Email] AS [Email], [Extent1].[SupportRepId] AS [SupportRepId] FROM [dbo].[Customer] AS [Extent1] WHERE [Extent1].[City] IN (N'Berlin',N'Paris')
|
|
Vaka 2 - Gruplamada Cast Sorunu
|
|
Açıklama
|
|
Gruplama uygulanmış olan bir LINQ sorgusunda Count genişletme metodunun(Extension Method) kullanılması halinde bir önceki versiyonda Cast operatörünün SQL sorgusuna dahil edildiği görülür. Ancak 4.0 versiyonunda bu gereksiz durum düzeltilmiştir.
|
|
Önceki Versiyon - LINQ Sorgusu
|
|
var result = from track in entites.Track group track by track.Composer into trackGrp select new { trackGrp.Key, Count = trackGrp.Count(), Sum = trackGrp.Sum<Track>(t => t.UnitPrice), Max = trackGrp.Max<Track>(t => t.UnitPrice), Min = trackGrp.Min<Track>(t => t.UnitPrice) };
foreach (var r in result) { Console.WriteLine(r.ToString()); }
|
|
Önceki Versiyon - SQL Sorgusu
|
|
SELECT 1 AS [C1], [GroupBy1].[K1] AS [Composer], [GroupBy1].[A1] AS [C2], [GroupBy1].[A2] AS [C3], [GroupBy1].[A3] AS [C4], [GroupBy1].[A4] AS [C5] FROM ( SELECT [Extent1].[Composer] AS [K1], COUNT( CAST( 1 AS bit)) AS [A1], SUM([Extent1].[UnitPrice]) AS [A2], MAX([Extent1].[UnitPrice]) AS [A3], MIN([Extent1].[UnitPrice]) AS [A4] FROM [dbo].[Track] AS [Extent1] GROUP BY [Extent1].[Composer] ) AS [GroupBy1]
|
|
4.0 - LINQ Sorgusu
|
|
var result = from track in entites.Tracks group track by track.Composer into trackGrp select new { trackGrp.Key, Count = trackGrp.Count(), Sum = trackGrp.Sum<Track>(t => t.UnitPrice), Max = trackGrp.Max<Track>(t => t.UnitPrice), Min = trackGrp.Min<Track>(t => t.UnitPrice) };
foreach (var r in result) { Console.WriteLine(r.ToString()); }
|
|
4.0 - SQL Sorgusu
|
|
SELECT 1 AS [C1], [GroupBy1].[K1] AS [Composer], [GroupBy1].[A1] AS [C2], [GroupBy1].[A2] AS [C3], [GroupBy1].[A3] AS [C4], [GroupBy1].[A4] AS [C5] FROM ( SELECT [Extent1].[Composer] AS [K1], COUNT(1) AS [A1], SUM([Extent1].[UnitPrice]) AS [A2], MAX([Extent1].[UnitPrice]) AS [A3], MIN([Extent1].[UnitPrice]) AS [A4] FROM [dbo].[Track] AS [Extent1] GROUP BY [Extent1].[Composer] ) AS [GroupBy1]
|
|
Vaka 3 - Join sorgularında Is Null Kontrolü
|
|
Açıklama
|
|
LINQ tarafında icra edilen aşağıdaki gibi bir Join sorgusunda, bir önceki versiyonda üretilen SQL ifadesinde anahtar alan için IS NULL kontrolü yapıldığı görülmektedir. 4.0 sürümünde ise gereksiz olan bu kontrol SQL tarafına aktarılmamaktadır.
|
|
Önceki Versiyon - LINQ Sorgusu
|
|
var result = from artist in entites.Artist join album in entites.Album on artist.ArtistId equals album.Artist.ArtistId select new { ArtistName = artist.Name, AlbumTitle = album.Title };
foreach (var r in result) { Console.WriteLine(r.ToString()); }
|
|
Önceki Versiyon - SQL Sorgusu
|
|
SELECT 1 AS [C1], [Extent1].[Name] AS [Name], [Extent2].[Title] AS [Title] FROM [dbo].[Artist] AS [Extent1] INNER JOIN [dbo].[Album] AS [Extent2] ON ([Extent1].[ArtistId] = [Extent2].[ArtistId]) OR (([Extent1].[ArtistId] IS NULL) AND ([Extent2].[ArtistId] IS NULL))
|
|
4.0 - LINQ Sorgusu
|
|
var result = from artist in entites.Artists join album in entites.Albums //on artist.ArtistId equals album.Artist.ArtistId on artist.ArtistId equals album.ArtistId //(Zaten yeni sürümde yandaki gibi yazabiliyoruz artık) select new { ArtistName = artist.Name, AlbumTitle = album.Title };
foreach (var r in result) { Console.WriteLine(r.ToString()); }
|
|
4.0 - SQL Sorgusu
|
|
SELECT [Extent1].[ArtistId] AS [ArtistId], [Extent1].[Name] AS [Name], [Extent2].[Title] AS [Title] FROM [dbo].[Artist] AS [Extent1] INNER JOIN [dbo].[Album] AS [Extent2] ON [Extent1].[ArtistId] = [Extent2].[ArtistId]
|
|
Vaka 4 - Skip, Take gibi Metod Kullanımlarında Tüm Alanların Sorguya Dahil Edilmesi
|
|
Açıklama
|
|
Aşağıdaki LINQ sorgusuna göre artistlerin tersten sıralanan adlar listesi ilk 10 satır atlanarak elde edilmektedir. 4.0 öncesi versiyonda bu tip bir LINQ sorgusunun çalıştırılması halinde SQL tarafında oluşturulan Sub SELECT sorgusunda aslında LINQ sorgusuna dahil edilmeyen alanlarında hesaba katıldığı gözlemlenir. 4.0 versiyonunda ise gereksiz alanların SELECT sorgusuna alınmasının önüne geçilmiştir.
|
|
Önceki Versiyon - LINQ Sorgusu
|
|
var result = (from artist in entites.Artist orderby artist.Name descending select artist.Name).Skip(10);
foreach (var r in result) { Console.WriteLine(r); }
|
|
Önceki Versiyon - SQL Sorgusu
|
|
SELECT [Extent1].[Name] AS [Name] FROM ( SELECT [Extent1].[ArtistId] AS [ArtistId], [Extent1].[Name] AS [Name], row_number() OVER (ORDER BY [Extent1].[Name] DESC) AS [row_number] FROM [dbo].[Artist] AS [Extent1] ) AS [Extent1] WHERE [Extent1].[row_number] > 10 ORDER BY [Extent1].[Name] DESC
|
|
4.0 - LINQ Sorgusu
|
|
var result = (from artist in entites.Artists orderby artist.Name descending select artist.Name).Skip(10);
foreach (var r in result) { Console.WriteLine(r); }
|
|
4.0 - SQL Sorgusu
|
|
SELECT [Extent1].[Name] AS [Name] FROM ( SELECT [Extent1].[Name] AS [Name], row_number() OVER (ORDER BY [Extent1].[Name] DESC) AS [row_number] FROM [dbo].[Artist] AS [Extent1] ) AS [Extent1] WHERE [Extent1].[row_number] > 10 ORDER BY [Extent1].[Name] DESC
|