Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
[2] Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
[3] Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
[4] Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
系列文章导航:
Linq To Sql进阶系列(四)User Define Function篇
Linq To Sql进阶系列(五)Store Procedure篇
Linq To Sql进阶系列(六)用object的动态查询与保存log篇
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
3, CLR与SQL在某些细节上的差别
在上文中,有一朋友提出,其值不为null才做为条件,让函数有局限性。既然提了,那笔者就再引申下。CLR与SQL中,对待null值是不同的。CLR认为两个null值是相等的,而SQL并不这么认为。比如,下面的条件就是成立的。
if (null == null)
throw new Exception("CLR treat Null is the same!!");
但在Sql中只能判断是不是null值,而不能对两个字段的null值直接比较。
比如下面的语句
var q6 = db.Employees.Where(c => c.Region == null).ToList();
翻译为:
[TitleOfCourtesy], [t0].[BirthDate], [t0].[HireDate], [t0].[Address], [t0].[City
], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[HomePhone], [t0].[Ext
ension], [t0].[Photo], [t0].[Notes], [t0].[ReportsTo], [t0].[PhotoPath]
FROM [dbo].[Employees] AS [t0]
WHERE [t0].[Region] IS NULL
Linq To Sql是通过Ado.Net于Sql打交道的。也就是说Linq To Sql是建立在CLR基础上的。这点细小的差别让Linq To Sql不知道该与谁保持平行。 Where条件中,有 == 和Equal两个方法,它们在Linq To Sql中是不一样的。Equal认为null是相等的。但是sql又不能用=来判断,所以Equal方法翻译的sql语句就有些长。请大家自己仔细比较下面两个语句的sql差别
var q5 = (from e in db.Employees
from o in db.Orders
where e.Region == o.ShipRegion
select new { e.Region, o }).ToList();
var q6 = (from e in db.Employees
from o in db.Orders
where Equals(e.Region, o.ShipRegion)
select new { e.Region, o }).ToList();
CLR和SQL在数值精度上的差别,也常让CLR抛OverFlow异常.这个很好判断,如果Ado.Net抛这个异常了,那Linq To Sql肯定要抛,所以并不是Linq To Sql的问题。
本文所提到代码,请到此下载完整版本.