“ LINQ to Entities”,“ LINQ to SQL”和“ LINQ to Dataset”之间有什么区别


91

我已经在LINQ工作了很长时间了。但是,提到的LINQ口味之间的真正区别是什么仍然是个谜。

成功的答案将包括它们之间的简短区别。每种口味的主要目标是什么,好处是什么,并且对性能有影响吗?

PS:我知道那里有很多信息源,但是我正在寻找一种“备忘单”,它指示新手去往特定目标的方向。


Answers:


110
  • 它们都是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所能做的就是返回DataSet,DataTables等,以及Linq -to-DataSets向那些数据存储区查询数据。因此,在这种情况下,您将从数据库后端返回一个DataTable或DataSets(System.Data命名空间),然后使用LINQ语法查询它们


1
祝贺您50k,您现在已经在StackOverflow上花费了太多时间。;)
Aaronaught

1
@Aaronaught:谢谢-你是绝对正确的!:-)要放弃一个沉迷于每个人,不是吗?请?!?!?!
marc_s 2010年

1
marc_s,感谢您的回答。您能否谈谈性能。从您的回答中,我会猜测Linq-to-Entities是最先进的,因此可能是性能最高的?
Marcel

2
@Marcel:从我的直觉出发(没有事实),我想说:Linq-to-SQL还是最快的(仅数据库和对象模型之间的一层),Linq-to-Dataset紧随其后,Linq-to -实体是最后一个实体,因为实体框架始终具有两层映射(因此是最复杂的)。但是再说一次:只是一种直觉,没有任何数字可以证明这一点
marc_s 2010年

3
@marc_s我知道这是一个老帖子,但是在大多数情况下,LINQ to Entities可能比LINQ to Dataset快。LINQ to Dataset并不是真正的类型,它是您将数据集用作对象的LINQ over Objects。由于LINQ over对象不执行任何SQL,因此必须首先从SQL源创建数据集,而LINQ over对象不能帮助您对将数据检索到数据集中进行任何查询优化。那和数据集是糟糕的性能,因为所有列都被装箱,所有类型转换都会破坏性能。
罗伯特·麦基

38

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,可以采取拉姆达以及因此而引起的有一些 Select是可以接受的拉姆达方法,它是幸福的。

现在考虑拉姆达可被编译或者成一个匿名方法(委托,对LINQ到对象,其包括LINQ到数据集),或者为表达式树(运行时模型表示中的对象模型中的拉姆达)。

对于内存中的数据(通常为IEnumerable<T>),它只执行委托-精细而快速。但是对于IQueryable<T>表达式(a 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,很抱歉,因为它不能回答问题。
Marcel

7
当有人编写自己的LINQ提供程序时,这是到目前为止我所看到的最好的答案。我不同意-1。
丹·巴罗维

30

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

  • 该数据源可能是SQL Server数据库-这是SQL的Linq
  • 该数据源可以是实体框架对象的数据上下文-实体的Linq
  • 该数据源可以是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 Server数据库中加载数据

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


3
实际上,Linq-to-SQL 仅是SQL Server,而不仅仅是“任何” SQL数据库后端。
marc_s

3
@marc_s:好地方。谢谢。虽然,如果有兴趣的话,如果您需要其他数据库的sql提供程序,则还有第三方Linq。参见code2code.net/DB_Linq或其他人的Google。我不能评论他们的质量。
西蒙·史蒂文斯

1
Simon,特别感谢Entitiy框架的两行有用的总结。+1
马塞尔(Marcel)2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.