首页 存档 技术 查看内容

为什么说 LINQ 要胜过 SQL

2018-3-30 13:00 |来自: 互联网 274 0

摘要: #深圳源创会,活动报名中# OSC-协作翻译原文:Why LINQ beats SQL 链接: https://www.linqpad.net/WhyLINQBeatsSQL.aspx 译者:leoxu,无若,BigEcho 如果你还没有沉溺于 LINQ,就会想这有啥大惊小怪的。SQL 并没 ...

#深圳源创会,活动报名中#


OSC-协作翻译

原文:Why LINQ beats SQL

链接:

https://www.linqpad.net/WhyLINQBeatsSQL.aspx

译者:leoxu,无若,BigEcho


如果你还没有沉溺于 LINQ,就会想这有啥大惊小怪的。SQL 并没有坏掉,为什么还要对它进行修补呢? 为什么我们还需要另外一种查询语言呢?


流行的说法是 LINQ 同C#(或者 VB)集成在了一起,故而消除了编程语言和数据库之间配合上的鸿沟,同时为多个数据源的组合提供了单一的查询接口。


虽然这些都是事实,但仅是故事的一部分。更重要的是:当要对数据库进行查询的时候,LINQ 在大多数情况下都比 SQL更加有效。


同 SQL 相比, LINQ 更简单、整洁而且高级。这样子更像是拿 C# 同 C 做比较。真的,尽管有时候使用 C 仍然是最好的选择(比如使用 SQL 的场景),但在大多数场景中,使用现代整洁的语言而不必为底层细节操作就是一项大胜利。


SQL 是一门非常古老的语言发明于 1974 年。虽然经历过了无数此扩展,但从来没有被重新设计过。这就使得它有点混乱了不像是 VB6 或者 Visual FoxPro。你也许已经慢慢变得习惯于此因而看不到任何错漏的地方!


让我们来看一个例子。你想要编写一个简单的查询来获取客户数据,如下:

SELECT UPPER(Name)

FROM Customer

WHERE Name LIKE 'A%'

ORDER BY Name

现在假设要将结果集里的这些数据提供给一个网页,并且我们想获取第 21 到 30 行数据。所以我们需要一个子查询:

SELECT UPPER(Name) FROM

(

SELECT *, RN = row_number()

OVER (ORDER BY Name)

FROM Customer

WHERE Name LIKE 'A%'

) A

WHERE RN BETWEEN 21 AND 30

ORDER BY Name

而如果你需要支持版本(在 SQL Server 2005 之前的)更老的数据库,情况会更糟糕:

SELECT TOP 10 UPPER (c1.Name)

FROM Customer c1

WHERE

c1.Name LIKE 'A%'

AND c1.ID NOT IN

(

SELECT TOP 20 c2.ID

FROM Customer c2

WHERE c2.Name LIKE 'A%'

ORDER BY c2.Name

)

ORDER BY c1.Name

这样做不仅复杂而混乱,而且也违背了 DRY 原则。如下是使用 LINQ 实现相同的查询功能。显然在简单性上更胜一筹:

var query =

from c in db.Customers

where c.Name.StartsWith ("A")

orderby c.Name

select c.Name.ToUpper();


var thirdPage = query.Skip(20).Take(10);

只有当我们枚举到thirdPage时,查询才会实际执行。在从 LINQ 到 SQL 或者 Entity Framework 的场景中,翻译引擎会将(我们用两个步骤组合而成的)查询转换成一个 SQL 语句,这个语句是针对其所连接的数据库服务器进行了优化的。


可组合性

您可能已经注意到 LINQ 的另一个更微妙(微妙但意义重大)的好处。我们选择了组合中的两个查询步骤:

IQueryable

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部