我在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