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

我已经在LINQ工作了一段时间了。 然而,在上面提到的LINQ之间,真正的区别还是有点神秘的。

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

PS我知道这里有很多信息来源,但是我正在寻找一种“小抄”,指导新手去哪里寻找特定的目标。

  • 他们都是LINQ – 语言集成查询 – 所以他们都有很多共同点。 所有这些“方言”基本上允许你从不同的来源做查询式的数据select。

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

  • Linq-to-Entities是一样的想法,但是在后台使用Entity Framework作为ORM – 同样来自微软,但支持多个数据库后端

  • Linq-to-DataSets是LINQ,但是在使用ADO.NET 2.0数据集的时候,在微软的ORM之前,ADO.NET所能做的就是返回DataSet,DataTable等,Linq -to-DataSets查询这些数据存储的数据。 因此,在这种情况下,您将从数据库后端返回DataTable或DataSets(System.Data名称空间),然后使用LINQ语法

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,其结果是有一些 Select方法可以接受lambda,这是很高兴的。

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

对于内存数据(通常是IEnumerable<T> ),它只是执行委托 – 罚款和快速。 但是对于IQueryable<T>expression式的对象表示(一个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查询返回less量数据的速度更快,通过networking加载整个数据库,然后在客户端进行筛选。 不过,两者都有理想的场景和错误的场景。

这里的目标和好处是允许您使用单一的静态检查语法来查询各种各样的数据源,并使代码更具expression性(例如,“传统”代码来对数据进行分组非常清楚它在做什么 – 它是在大量的代码中丢失的)。

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

  • 该数据源可能是一个SQL服务器数据库 – 这是从Linq到SQL
  • 该数据源可以是entity framework对象的数据上下文 – Linq到实体
  • 该数据源可能是ADO.net数据集 – Linq到Dataset

该数据源也可以是一个XML文件 – Linq to XML
甚至只是一个简单对象的集合类 – Linq到对象

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

对于一些额外的背景:

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

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

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