"LINQ to Entities"、"LINQ to SQL"和"LINQ to Dataset"之间有什么区别?

110

我已经花了很长时间在LINQ上工作。然而,它们之间的真正区别仍然是个谜。

成功的答案将包含它们之间的简要区分。每个类型的主要目标是什么,有什么好处,并且是否会对性能产生影响...

P.S. 我知道那里有很多信息来源,但我正在寻找一种“作弊表”,指导新手为实现特定目标去哪里。


2
另请参见https://dev59.com/NkzSa4cB1Zd3GeqPnowp。 - H H
3个回答

128
  • 它们中的所有方言都是针对 Language Integrated Query(LINQ)的,因此它们都共享很多共性。这些“方言”基本上允许您从各种来源进行查询式选择数据。

  • Linq-to-SQL 是微软首次尝试的 ORM(对象关系映射器)。它仅支持 SQL Server。它是一种映射技术,将 SQL Server 数据库表映射到 .NET 对象。

  • Linq-to-Entities 与 Linq-to-SQL 相同,但在后台使用 Entity Framework 作为 ORM - 同样来自 Microsoft,但支持多个数据库后端。

  • Linq-to-DataSets 是 LINQ,但是针对“旧式”的 ADO.NET 2.0 DataSets 使用 - 在 Microsoft 推出 ORM 之前的时代,您可以使用 ADO.NET 返回 DataSets、 DataTables 等。Linq-to-DataSets 查询这些数据存储以获取数据。因此,在这种情况下,您将从数据库后端返回一个 DataTable 或 DataSets(System.Data 命名空间),然后使用 LINQ 语法查询这些数据。


2
恭喜你达到了5万的里程碑,现在你已经正式在StackOverflow上花费了太多的时间了。 ;) - Aaronaught
2
@Aaronaught:谢谢 - 你说得太对了! :-) 每个人都必须留下一种瘾好吧,不是吗?拜托了?!?!? - marc_s
2
@Marcel:从我的直觉来看(没有硬性事实),我会说:Linq-to-SQL 是最快的(数据库和对象模型之间只有一层),Linq-to-Dataset 接近其后,而 Linq-to-Entities 最慢,因为 Entity Framework 总是有两层映射(因此最复杂)。但再次强调:这只是我的直觉,没有数据支持。 - marc_s
4
@marc_s 我知道这是一个老帖子,但在大多数情况下,LINQ to Entities比LINQ to Dataset更快。LINQ to Dataset实际上不是一种类型,它是针对对象的LINQ,而你正在将数据集用作对象。由于针对对象的LINQ不执行任何SQL操作,因此必须先从SQL源创建数据集,并且针对对象的LINQ无法帮助您对检索数据到数据集的查询进行任何优化。此外,数据集在性能方面非常糟糕,因为所有列都被装箱,所有这些类型转换都会影响性能。 - Robert McKee
1
使用LINQ to Entities与MSSQL Server而不是LINQ to SQL是否有什么原因?例如,Data/DbContext对象似乎存在一些差异。 - ruffin
显示剩余2条评论

40

LINQ是一组广泛的技术,基于(例如)查询理解语法,例如:

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;

这段代码将被编译器映射为:

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);

然后,真正的魔法开始了。请注意,我们还没有说过这里的 Foo 是什么 - 但编译器并不关心!只要它可以解析出一个名为 Where 的适当方法,并且这个方法可以接受 lambda 表达式,以及该结果具有某些可以接受 lambda 表达式的 Select 方法,它就很高兴。

现在考虑 lambda 表达式可以被编译成匿名方法(委托,用于 LINQ-to-Objects,包括 LINQ-to-DataSet),或者编译成表达式树(表示对象模型中的 lambda 的运行时模型)。

对于内存数据(通常是 IEnumerable<T>),它只需执行委托 - 很好很快。但对于 IQueryable<T>,表达式的对象表示形式(LambdaExpression<...>)可以将其解开并应用于任何“LINQ-to-Something”示例。

对于数据库(LINQ-to-SQL、LINQ-to-Entities)可能意味着编写 TSQL,例如:

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

但它可能意味着(例如对于ADO.NET数据服务)编写一个HTTP查询。

执行一个返回少量数据的良好编写的TSQL查询比通过网络加载整个数据库,然后在客户端进行筛选更快。两者都有理想情况和明显错误的情况。

这里的目标和好处是允许您使用单个静态检查的语法查询各种数据源,并使代码更具表现力(例如,“传统”代码分组数据并不清楚它试图做什么 - 它在大量代码中迷失了方向)。


Marc,感谢您的见解。然而,我并没有询问如此详细的内部信息。-1,很抱歉,因为它并没有回答我的问题。 - Marcel
9
作为一位编写自己的 LINQ 提供程序的人,这是我迄今为止看到的最好的答案。我不同意关于 -1 的观点。 - Dan Barowy

34

LINQ是语言集成查询的缩写。它允许您直接在C#中使用“SQL风格”的查询语言从数据源中提取信息。

  • 该数据源可以是SQL Server数据库 - 这就是Linq to SQL
  • 该数据源可以是实体框架对象的数据上下文 - Linq to entities
  • 该数据源可以是ADO.net数据集 - Linq to Dataset

该数据源也可以是XML文件 - Linq to XML
甚至只是一组普通对象的Collection类 - Linq to Objects

LINQ描述了查询技术,其余部分描述了被查询数据的来源。

以下是一些额外的背景信息:

Datasets是ADO.net对象,其中数据从数据库加载到.net Dataset中,加载数据后可以使用Linq查询该数据。

使用Linq to SQL,您可以定义映射到数据库的.net类,Linq-to-SQL会负责从SQL Server数据库中加载数据。

最后,Entity Framework是一个系统,在其中可以定义数据库和对象映射,然后可以使用Linq查询通过此映射加载的数据。


4
实际上,Linq-to-SQL 只支持 SQL Server,而不是任何 SQL 数据库后端。 - marc_s
3
@marc_s: 发现得好。谢谢。不过,如果有人感兴趣的话,可以使用第三方Linq to sql提供程序来连接其他数据库。请参见http://code2code.net/DB_Linq/,或在Google上搜索其他提供程序。我无法评论它们的质量。 - Simon P Stevens
1
Simon,特别感谢你提供的有关Entity框架的两行简要概述,非常有帮助。+1 - Marcel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接