Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
LINQ to SQL, Standart Sorgu İşleçlerini SQL komutlarına çevirir. Veritabanının sorgu işlemcisi, SQL çevirisinin yürütme semantiğini belirler.
Standart Sorgu İşleçleri dizilere göre tanımlanır. Bir sıra sıralanır ve dizinin her öğesi için başvuru kimliğine dayanır. Daha fazla bilgi için bkz. Standart Sorgu İşleçlerine Genel Bakış (C#) veya Standart Sorgu İşleçlerine Genel Bakış (Visual Basic) .
SQL öncelikli olarak sıralanmamış değer kümeleriyle ilgilenir. Sıralama genellikle ara sonuçlar yerine bir sorgunun son sonucuna uygulanan açıkça belirtilen, işlem sonrası bir işlemdir. Kimlik değerler tarafından tanımlanır. Bu nedenle SQL sorgularının kümeler yerine çoklu kümeler (torbalar) ile çalıştığı anlaşılır.
Aşağıdaki paragraflarda Standart Sorgu İşleçleri ile LINQ to SQL için SQL Server sağlayıcısına yönelik SQL çevirisi arasındaki farklar açıklanmaktadır.
İşleç Desteği
Concat
Concat yöntemi, alıcının sırasının ve bağımsız değişkenin sırasının aynı olduğu sıralı çoklu kümeler için tanımlanır.
Concat, ortak düzene göre birden çok küme üzerinde UNION ALL
olarak çalışır.
Son adım, sonuçlar üretilmeden önce SQL'de sıralamaktır. Concat argümanlarının sırasını korumaz. Uygun sıralamayı sağlamak için Concat sonuçlarını açıkça sıralamanız gerekir.
Kesiş, Hariç, Birleşim
Intersect ve Except yöntemleri yalnızca kümelerde iyi tanımlanmıştır. Çoklu kümelerin semantiği tanımlanmamıştır.
Union yöntemi, çok kümeli kümelerin sıralanmamış birleştirmesi olarak tanımlanır (sql'deki UNION ALL yan tümcesinin sonucu).
Al, Atla
Take ve Skip yöntemleri yalnızca sıralı kümelerde iyi tanımlanmıştır. Sıralanmamış kümeler veya çoklu kümeler için semantik tanımlanmamıştır.
Uyarı
Take ve Skip SQL Server 2000'e yönelik sorgularda kullanıldıklarında belirli sınırlamaları vardır. Daha fazla bilgi için Sorun Giderme'deki "SQL Server 2000'de Özel Durumları Atla ve Al" girdisine bakın.
SQL'de sıralamayla ilgili sınırlamalar nedeniyle LINQ to SQL, bu yöntemlerin bağımsız değişkeninin sıralamasını yönteminin sonucuna taşımaya çalışır. Örneğin, aşağıdaki LINQ to SQL sorgusunu göz önünde bulundurun:
var custQuery =
(from cust in db.Customers
where cust.City == "London"
orderby cust.CustomerID
select cust).Skip(1).Take(1);
Dim custQuery = _
From cust In db.Customers _
Where cust.City = "London" _
Order By cust.CustomerID _
Select cust Skip 1 Take 1
Bu kod için oluşturulan SQL, sıralamayı aşağıdaki gibi sona taşır:
SELECT TOP 1 [t0].[CustomerID], [t0].[CompanyName],
FROM [Customers] AS [t0]
WHERE (NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM (
SELECT TOP 1 [t1].[CustomerID]
FROM [Customers] AS [t1]
WHERE [t1].[City] = @p0
ORDER BY [t1].[CustomerID]
) AS [t2]
WHERE [t0].[CustomerID] = [t2].[CustomerID]
))) AND ([t0].[City] = @p1)
ORDER BY [t0].[CustomerID]
Belirtilen tüm sıralamanın Take ve Skip birlikte zincirlendiğinde tutarlı olması gerektiği açıkça ortaya çıkar. Aksi takdirde, sonuçlar tanımsız olur.
Hem Take hem de Skip, Standart Sorgu İşleci belirtimine göre negatif olmayan, sabit tamsayı parametreler için iyi tanımlanmıştır.
Çevirisi Olmayan İşleçler
Aşağıdaki yöntemler LINQ tarafından SQL'e çevrilmemiştir. En yaygın neden, sıralanmamış çoklu kümeler ve diziler arasındaki farktır.
Operatörler | Mantığı |
---|---|
TakeWhile, SkipWhile | SQL sorguları dizilerde değil, çoklu kümelerde çalışır.
ORDER BY sonuçlara uygulanan son madde olmalıdır. Bu nedenle, bu iki yöntem için genel amaçlı çeviri yoktur. |
Reverse | Bu yöntemin çevirisi sıralı bir küme için mümkündür ancak şu anda LINQ tarafından SQL'e çevrilmemiştir. |
Last, LastOrDefault | Bu yöntemlerin çevirisi sıralı bir küme için mümkündür, ancak şu anda LINQ tarafından SQL'e çevrilmemiştir. |
ElementAt, ElementAtOrDefault | SQL sorguları, dizinlenebilir dizilerde değil, çoklu kümelerde çalışır. |
DefaultIfEmpty (varsayılan arg ile aşırı yükleme) | Genel olarak, keyfi bir demet için varsayılan değer belirtilemez. Tupler için null değerler bazı durumlarda dış birleşimler aracılığıyla mümkündür. |
İfade Çevirisi
Null anlamsallığı
LINQ to SQL, SQL üzerinde null karşılaştırma semantiği uygulamaz. Karşılaştırma operatörleri, söz dizimsel olarak SQL eşdeğerlerine çevrilir. Bu nedenle semantik, sunucu veya bağlantı ayarları tarafından tanımlanan SQL semantiğini yansıtır. Örneğin, iki null değer varsayılan SQL Server ayarları altında eşit değil olarak kabul edilir, ancak semantiği değiştirmek için ayarları değiştirebilirsiniz. LINQ to SQL, sorguları çevirirken sunucu ayarlarını dikkate almaz.
"Sabit değer null ile karşılaştırma, uygun SQL sürümüne (is null
veya is not null
) çevrilir."
harmanlama içindeki değeri null
SQL Server tarafından tanımlanır. LINQ to SQL harmanlamayı değiştirmez.
Toplamlar
Standart Sorgu İşleci toplama yöntemi Sum , boş bir dizi için veya yalnızca null içeren bir dizi için sıfır olarak değerlendirilir. LINQ to SQL'de, SQL semantiği değişmeden bırakılır ve Sum boş bir dizi veya yalnızca null değerleri içeren bir dizi için sıfır yerine null
olarak değerlendirilir.
Ara sonuçlardaki SQL sınırlamaları LINQ to SQL'deki toplamalar için geçerlidir. Sum 32 bit tamsayı miktarları, 64 bit sonuçlar kullanılarak hesaplanmaz. Standart Sorgu Operatörü uygulaması ilgili bellek içi dizi için taşmaya neden olmasa bile LINQ to SQL çevirisi Sum için taşma oluşabilir.
Benzer şekilde, tamsayı değerlerinin Average LINQ to SQL çevirisi, integer
olarak değil, double
olarak hesaplanır.
Varlık Argümanları
LINQ to SQL, varlık türlerinin GroupBy ve OrderBy yöntemlerinde kullanılmasını sağlar. Bu işleçlerin çevirisinde, bir türün bağımsız değişkeninin kullanılması, bu türün tüm üyelerini belirtmeye eşdeğer olarak kabul edilir. Örneğin, aşağıdaki kod eşdeğerdir:
db.Customers.GroupBy(c => c);
db.Customers.GroupBy(c => new { c.CustomerID, c.ContactName });
db.Customers.GroupBy(Function(c) c)
db.Customers.GroupBy(Function(c) New With {c.CustomerID, _
c.ContactName})
Eşitlenebilir / Karşılaştırılabilir Bağımsız Değişkenler
Aşağıdaki metotların uygulanmasında argümanların eşitliği gerekir.
LINQ to SQL, düz bağımsız değişkenler için eşitlik ve karşılaştırmayı destekler, ancak diziler olan veya diziler içeren bağımsız değişkenleri desteklemez. Düz argüman, SQL satırına eşlenebilir bir türdür. Statik olarak bir dizi içermediği belirlenebilen bir veya daha fazla varlık türünün projeksiyonu düz argüman olarak kabul edilir.
Aşağıda düz argümanlara örnekler verilmiştir:
db.Customers.Select(c => c);
db.Customers.Select(c => new { c.CustomerID, c.City });
db.Orders.Select(o => new { o.OrderID, o.Customer.City });
db.Orders.Select(o => new { o.OrderID, o.Customer });
db.Customers.Select(Function(c) c)
db.Customers.Select(Function(c) New With {c.CustomerID, c.City})
db.Orders.Select(Function(o) New With {o.OrderID, o.Customer.City})
db.Orders.Select(Function(o) New With {o.OrderID, o.Customer})
Aşağıda düz olmayan (hiyerarşik) bağımsız değişkenlere örnekler verilmiştir:
// In the following line, c.Orders is a sequence.
db.Customers.Select(c => new { c.CustomerID, c.Orders });
// In the following line, the result has a sequence.
db.Customers.GroupBy(c => c.City);
' In the following line, c.Orders is a sequence.
db.Customers.Select(Function(c) New With {c.CustomerID, c.Orders})
' In the following line, the result has a sequence.
db.Customers.GroupBy(Function(c) c.City)
Visual Basic İşlev Çevirisi
Visual Basic derleyicisi tarafından kullanılan aşağıdaki yardımcı işlevler ilgili SQL işleçlerine ve işlevlerine çevrilir:
CompareString
DateTime.Compare
Decimal.Compare
IIf (in Microsoft.VisualBasic.Interaction)
Dönüştürme yöntemleri:
ToBoolean
ToSByte
ToByte
ToChar
ToCharArrayRankOne
ToDate
ToDecimal
ToDouble
ToInteger
ToUInteger
ToLong
ToULong
ToShort
ToUShort
ToSingle
ToString
Devralma Desteği
Devralım Eşleme Kısıtlamaları
Daha fazla bilgi için bkz: Nasıl yapılır: Devralma Hiyerarşilerini Eşleme.
Sorgularda Kalıtım
C# dönüştürmeleri yalnızca projeksiyonda desteklenir. Başka bir yerde kullanılan dönüştürmeler çevrilmiyor ve yoksayılıyor. SQL işlev adlarının yanı sıra, SQL yalnızca ortak dil çalışma zamanının (CLR) Converteşdeğerini gerçekleştirir. Başka bir ifadeyle, SQL bir türün değerini başka bir türe değiştirebilir. Başka bir türdekilerle aynı bitleri yeniden yorumlama kavramı olmadığından CLR atamasının eşdeğeri yoktur. Bu nedenle C# ataması yalnızca yerel olarak çalışır. Uzak değil.
Operatörler, is
ve as
, ve GetType
yöntemi, Select
operatörü ile sınırlı değildir. Bunlar diğer sorgu işleçlerinde de kullanılabilir.
SQL Server 2008 Desteği
.NET Framework 3.5 SP1'den başlayarak, LINQ to SQL, SQL Server 2008 ile sunulan yeni tarih ve saat türlerine eşlemeyi destekler. Ancak, LINQ to SQL sorgu işleçlerinde, bu yeni türlerle eşlenen değerlerle çalışırken kullanabileceğiniz bazı sınırlamalar vardır.
Desteklenmeyen Sorgu İşleçleri
Aşağıdaki sorgu işleçleri, yeni SQL Server tarih ve saat türleriyle eşlenen değerlerde desteklenmez: DATETIME2
, DATE
, TIME
ve DATETIMEOFFSET
.
Aggregate
Average
LastOrDefault
OfType
Sum
Bu SQL Server tarih ve saat türlerine eşleme hakkında daha fazla bilgi için bkz. tür eşlemesiSQL-CLR.
SQL Server 2005 Desteği
LINQ to SQL aşağıdaki SQL Server 2005 özelliklerini desteklemez:
SQL CLR için yazılmış saklı yordamlar.
Kullanıcı tanımlı tür.
XML sorgusu özellikleri.
SQL Server 2000 Desteği
Aşağıdaki SQL Server 2000 sınırlamaları (Microsoft SQL Server 2005 ile karşılaştırıldığında) LINQ to SQL desteğini etkiler.
Çapraz Uygulama ve Dış Uygulama İşleçleri
Bu işleçler SQL Server 2000'de kullanılamaz. LINQ to SQL, bunları uygun birleşimlerle değiştirmek için bir dizi yeniden yazma dener.
Cross Apply
ve Outer Apply
ilişki navigasyonları için oluşturulur. Bu tür yeniden yazmaların mümkün olduğu sorgu kümesi iyi tanımlanmamıştır. Bu nedenle, SQL Server 2000 için desteklenen en düşük sorgu kümesi, ilişki gezintisi içermeyen kümedir.
text / ntext
Veri türleri text
/ ntext
, Microsoft SQL Server 2005 tarafından desteklenen varchar(max)
/ nvarchar(max)
karşı belirli sorgu işlemlerinde kullanılamaz.
Bu sınırlama için çözüm yoktur. Özellikle, Distinct()
veya text
sütunlarına eşlenen üyeler içeren herhangi bir sonuç üzerinde ntext
kullanamazsınız.
İç İçe Sorguların Tetiklediği Davranış
SQL Server 2000 (SP4'e kadar) bağlayıcısı, iç içe geçmiş sorgular tarafından tetiklenen bazı özgünlükler içerir. Bu idiosyncrasies tetikleyen SQL sorguları kümesi iyi tanımlanmamıştır. Bu nedenle, SQL Server özel durumlarına neden olabilecek LINQ to SQL sorguları kümesini tanımlayamazsınız.
Atla ve Al Operatörleri
Take ve Skip SQL Server 2000'e yönelik sorgularda kullanıldıklarında belirli sınırlamaları vardır. Daha fazla bilgi için Sorun Giderme'deki "SQL Server 2000'de Özel Durumları Atla ve Al" girdisine bakın.
Nesne Gerçekleştirme
Gerçekleştirme, bir veya daha fazla SQL sorgusu tarafından döndürülen satırlardan CLR nesneleri oluşturur.
Aşağıdaki çağrılar, gerçekleştirmenin bir parçası olarak yerel olarak yürütülür :
Kurucular
ToString
projeksiyonlardaki yöntemlerProjeksiyonlarda tür atamaları
yöntemini izleyen AsEnumerable yöntemler yerel olarak yürütülür. Bu yöntem anında yürütmeye neden olmaz.
Sorgu sonucunun dönüş türü olarak veya sonuç türünün bir üyesi olarak kullanabilirsiniz
struct
. Varlıkların mutlaka sınıf olması gereklidir. Anonim türler sınıf örnekleri olarak oluşturulur, ancak projeksiyonda varlıklar değil, adlandırılmış yapılar kullanılabilir.Bir sorgu sonucunun dönüş türünün bir üyesi, IQueryable<T> türünde olabilir. Yerel bir koleksiyon olarak oluşturulmuştur.
Aşağıdaki yöntemler, yöntemlerin uygulandığı dizinin hemen gerçekleştirilmesine sebep olur.