【问题标题】:What is the difference between "LINQ to Entities", "LINQ to SQL" and "LINQ to Dataset"“LINQ to Entities”、“LINQ to SQL”和“LINQ to Dataset”有什么区别
【发布时间】:2011-01-27 11:32:51
【问题描述】:

我已经使用 LINQ 工作了很长时间。然而,所提到的 LINQ 风格之间的真正区别是什么仍然是一个谜。

成功的答案将包含它们之间的简短区别。每种风味的主要目标是什么,有什么好处,是否对性能有影响...

附: 我知道那里有很多信息来源,但我正在寻找一种“备忘单”,它可以指导新手去哪里实现特定目标。

【问题讨论】:

标签: c# sql linq dataset entities


【解决方案1】:

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 在这里是什么 - 编译器不在乎!只要它能够解析 some 合适的名为 Where 的可以接受 lambda 的方法,并且其结果有 some Select 可以接受 lambda 的方法,很开心。

现在考虑 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 查询比通过网络加载整个数据库然后在客户端进行过滤要快。不过,两者都有理想的场景和明显错误的场景。

这里的目标和好处是允许您使用单一的静态检查语法来查询广泛的数据源,并使代码更具表现力(“传统”代码对数据进行分组,例如,在它试图做什么方面不是很清楚 - 它在大量代码中丢失)。

【讨论】:

  • 马克,感谢您的洞察力。但是,我没有询问如此详细的内部结构。 -1,对不起,因为它没有回答问题。
  • 作为一个编写自己的 LINQ 提供程序的人,这是迄今为止我看到的最好的答案。我不同意 -1。
【解决方案2】:

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

  • 该数据源可以是 SQL 服务器数据库 - 这是 Linq to SQL
  • 该数据源可以是实体框架对象的数据上下文 - Linq to entity
  • 该数据源可能是 ADO.net 数据集 - Linq to Dataset

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

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

一些额外的背景:

数据集 是 ADO.net 对象,其中数据从数据库加载到 .net 数据集,Linq 可用于在加载后查询该数据。

使用 Linq to SQL,您可以定义映射到数据库的 .net 类,Linq-to-SQL 负责从 SQL 服务器数据库加载数据

最后,实体框架是一个系统,您可以在其中定义数据库和 XML 对象映射,然后可以使用 Linq 查询通过该映射加载的数据。

【讨论】:

  • 实际上,Linq-to-SQL 只是 SQL Server - 而不仅仅是“任何”SQL 数据库后端。
  • @marc_s:好地方。谢谢。虽然,如果有人感兴趣,如果你想要的话,还有第三方 Linq to sql 提供程序可以用于其他数据库。请参阅code2code.net/DB_Linq,或谷歌了解其他人。不过,我无法评论它们的质量。
  • Simon,特别感谢 Entitiy 框架的两行总结。 +1
【解决方案3】:
  • 它们都是 LINQ - 语言集成查询 - 所以它们都有很多共同点。所有这些“方言”基本上都允许您对来自各种来源的数据进行查询式选择。

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

  • Linq-to-Entities 是相同的想法,但在后台使用实体框架作为 ORM - 再次来自 Microsoft,但支持多个数据库后端

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

【讨论】:

  • 恭喜你获得 50k,你现在正式在 StackOverflow 上花费了太多时间。 ;)
  • @Aaronaught:谢谢——你说得对! :-) 必须让每个人都一个上瘾,不是吗?请问?!?!?!
  • marc_s,感谢您的回答。你能告诉一些关于性能的事情吗?根据您的回答,我猜想 Linq-to-Entities 是最先进的,因此可能是性能最好的?
  • @Marcel:从我的直觉(没有确凿的事实),我会说:Linq-to-SQL 或者是最快的(数据库和对象模型之间只有一层),Linq-to-Dataset紧随其后,Linq-to-Entities 排在最后,因为实体框架总是有两层映射(因此最复杂)。但再说一遍:只是一种直觉,没有数字支持
  • @marc_s 我知道这是一篇旧帖子,但在大多数情况下,LINQ to Entities 可能比 LINQ to Dataset 更快。 LINQ to Dataset 并不是真正的类型,它是您使用数据集作为对象的对象上的 LINQ。由于 LINQ over objects 不执行任何 SQL,因此您必须首先从 SQL 源创建数据集,并且 LINQ over objects 无法帮助您在将数据检索到数据集中时执行任何查询优化。这和数据集的性能很糟糕,因为所有列都被装箱了,所有类型转换都会影响性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多