Ben LinqPad sorguları ile deneyler oldum. Ben sql sorgusu Lots.Where(l => l.Side == 'A')
bir linq yazarken bir sütun Side char(1)
ile masa Lot
., o Lots.Where(l => l.Side.Equals('A'))
kullanarak,Farklı SQL nereden üretildi (l => l.Side == 'A') vs Nerede (l => l.Side.Equals ('A')
-- Region Parameters
DECLARE @p0 Int = 65
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE UNICODE([t0].[Side]) = @p0
Ancak aşağıdaki sQL üretir, bu naif de olsa (
-- Region Parameters
DECLARE @p0 Char(1) = 'A'
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE [t0].[Side] = @p0
o üzerine oluşacak üretir) Denetim, o ikinci marjinal olarak daha hızlı olurdu, çünkü UNICODE
numaralı aramaya gerek duymuyor.
int
, smallint
veya ==
veya .Equals
üretilen SQL arasında hiçbir fark yoktur varchar
sütunları, neden char(1)
edilir kullanma ve ilgili C# tipi char
farklı?
Belirli bir sütun türünün iki eşitlik denetimi biçimiyle farklı SQL üretip üretmeyeceğini tahmin etmenin bir yolu var mı?
Düzenleme:
MS SQL tarafından desteklenen her türlü kontrol ettik ve sadece char(1)
ve nchar(1)
bu davranışı gösterirler. Her ikisi de System.Char
türüyle LinqToSql'de temsil edilir. o kasıtlı bir karar olsaydı, o zaman System.Byte
ile temsil (ancak bunun yerine 1
uzunluğunda System.Linq.Binary
olduğunu olabilir binary(1)
aynı davranışı, umuyordum
Düzenleme 2:. alakalı olması durumunda, öyleyim LINQPad kullanarak yaratılan SQL'i görüntülemekteyim Linqpad'in sistemin LinqToSQL'i kullanacağını varsayıyordum, ama bugün bu varsayımın kusurlu olabileceğini düşünüyordum.
Düzenleme 3: LinqToSQL sistemini test etmek için hızlı bir VS projesi yürüttüm ve aynı sonucu elde edin:
Kod:
static void Main(string[] args)
{
var db = new DataClasses1DataContext {Log = Console.Out};
Console.Out.WriteLine("l.Side == 'A'");
Console.Out.WriteLine("=============");
Console.Out.WriteLine();
foreach (Lot ll in db.Lots.Where(l => l.Side == 'A'))
{
break;
}
Console.Out.WriteLine();
Console.Out.WriteLine("---------------------------------------");
Console.Out.WriteLine();
Console.Out.WriteLine("l.Side.Equals('A')");
Console.Out.WriteLine("==================");
Console.Out.WriteLine();
foreach (Lot ll in db.Lots.Where(l => l.Side.Equals('A')))
{
break;
}
Console.In.Read();
}
Çıktı:
l.Side == 'A'
=============
SELECT ..., [t0].[Side], ...
FROM [dbo].[Lot] AS [t0]
WHERE UNICODE([t0].[Side]) = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [65]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.6.1532.0
---------------------------------------
l.Side.Equals('A')
==================
SELECT ..., [t0].[Side], ...
FROM [dbo].[Lot] AS [t0]
WHERE [t0].[Side] = @p0
-- @p0: Input Char (Size = 1; Prec = 0; Scale = 0) [A]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.6.1532.0
O .Equals
versiyonunda, bu char
olarak geçirilen oysa == 'A'
versiyonunda, parametre, bir int
olarak geçirilen olduğunu ilginçtir.
The dbml and table creation script are in this gist.
DBML eşleştirmesini yayınlayabilir misiniz? – usr
@usr, bu LINQPad aracılığıyla oldu, bunun için haritalamayı nasıl alacağımı bilmiyorum. – RoadieRich