Ho sperimentato con query in LinqPad. tavolo Lot
con una colonna Side char(1)
. Quando scrivo una query LINQ to SQL Lots.Where(l => l.Side == 'A')
, produce il seguente SQLSQL diverso prodotto da Where (l => l.Side == 'A') vs Where (l => l.Side.Equals ('A')
-- Region Parameters
DECLARE @p0 Int = 65
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE UNICODE([t0].[Side]) = @p0
Tuttavia, utilizzando Lots.Where(l => l.Side.Equals('A'))
, produce
-- Region Parameters
DECLARE @p0 Char(1) = 'A'
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE [t0].[Side] = @p0
sembrerebbe momento (sebbene semplificata) ispezione, che quest'ultimo sarebbe marginalmente più veloce, così come è non è necessario chiamare allo UNICODE
.
Utilizzando int
, smallint
o varchar
colonne non c'è differenza tra il prodotto con SQL ==
o .Equals
, perché è char(1)
e il corrispondente C# tipo char
diverso?
C'è un modo per prevedere se un determinato tipo di colonna produrrà SQL diverso con le due forme di controllo di uguaglianza?
Edit:
Ho controllato ogni tipo supportato da MS SQL, e solo char(1)
e nchar(1)
mostrare questo comportamento. Entrambi sono rappresentati in LinqToSql dal tipo System.Char
. Se è stata una decisione deliberata, quindi mi sarei aspettato lo stesso comportamento su binary(1)
, che potrebbe essere rappresentato da System.Byte
(ma invece è System.Linq.Binary
con una lunghezza di 1
Edit. 2: Nel caso in cui è rilevante, io sono utilizzando LINQPad per visualizzare l'SQL creato. Stavo supponendo che Linqpad usasse il LinqToSQL del sistema, ma oggi mi sono reso conto che quell'ipotesi poteva essere imperfetta
Modifica 3: ho eseguito un rapido progetto VS per testare il sistema LinqToSQL, e noi ottenere lo stesso risultato:
Codice:
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();
}
uscita:
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
E 'interessante notare che nella versione == 'A'
, il parametro viene passato come int
, mentre nella versione .Equals
, viene passato come char
.
The dbml and table creation script are in this gist.
Puoi pubblicare la mappatura DBML? – usr
@usr era attraverso LINQPad, per il quale non so come recuperare la mappatura. – RoadieRich