|
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.
.gif)
|
|
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
|