我在LinqPad中試驗過不同的查詢。表Lot
與列Side char(1)
。當我寫的LINQ to SQL查詢Lots.Where(l => l.Side == 'A')
,它產生下面的SQLWhere Where(l => l.Side =='A')與Where 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
然而,使用Lots.Where(l => l.Side.Equals('A'))
,它產生
-- Region Parameters
DECLARE @p0 Char(1) = 'A'
-- EndRegion
SELECT ..., [t0].[Side], ...
FROM [Lot] AS [t0]
WHERE [t0].[Side] = @p0
它會出現在(儘管天真)檢查,後者的速度會稍微快一點,因爲它會不需要致電UNICODE
。
使用int
,smallint
或varchar
列有與==
或.Equals
產生的SQL沒有什麼區別,爲什麼char(1)
和相應的C#類型char
不同?
有什麼辦法來預測給定的列類型是否會產生與兩種形式的相等性檢查不同的SQL?
編輯:
我已經檢查通過MS SQL支持所有類型的,只有char(1)
和nchar(1)
顯示此行爲。在LinqToSql中,兩者都由System.Char
類型表示。如果這是一個深思熟慮的決定,那麼我本來期望在binary(1)
相同的行爲,這可能是System.Byte
表示(反而是System.Linq.Binary
與1
長度
編輯2:如果它是相關的,我使用LINQPad查看創建的SQL,我假設Linqpad會使用系統的LinqToSQL,但是我今天意識到這種假設可能有缺陷
編輯3:我運行了一個快速VS項目來測試系統LinqToSQL,得到相同的結果:
代碼:
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();
}
輸出:
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
有趣的是,要注意的是,在== 'A'
版本,參數爲int
過去了,而在.Equals
版本,它是作爲char
通過。
The dbml and table creation script are in this gist.
你可以發佈DBML映射嗎? – usr
@usr這是通過LINQPad,爲此我不知道如何檢索映射。 – RoadieRich