您的位置:知识库 » 数据库

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别

作者: Tom Song  来源: 博客园  发布时间: 2008-09-27 12:04  阅读: 16996 次  推荐: 0   原文链接   [收藏]  

系列文章导航:

Linq To Sql进阶系列(一)从映射讲起

Linq To Sql进阶系列(二)M:M关系

Linq To Sql进阶系列(三)CUD和Log

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();
翻译为:

SELECT [t0].[EmployeeID][t0].[LastName][t0].[FirstName][t0].[Title][t0].
[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的问题。
本文所提到代码,请到此下载完整版本

0
0

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻