Answers:
它们都是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语法查询它们
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查询以返回少量数据的速度比通过网络加载整个数据库然后在客户端进行过滤要快。两者都有理想的情况和错误的情况。
此处的目标和好处是允许您使用单一的,经过静态检查的语法来查询各种数据源,并使代码更具表现力(例如,“传统”代码无法对数据进行分组)就其要执行的操作而言非常清楚-它在大量的代码中丢失了)。
LINQ代表语言集成查询。它允许您直接在C#中使用“ SQL样式”查询语言从数据源中提取信息。
该数据源也可以是XML文件-Linq to XML。
甚至只是普通对象的Collection类-Linq to Objects。
LINQ描述了查询技术,其余名称描述了要查询的数据源。
对于一些额外的背景:
数据集是ADO.net对象,其中数据从数据库加载到.net数据集,并且Linq可用于在数据加载后查询该数据。
使用Linq to SQL,您可以定义映射到数据库的.net类,并且Linq-to-SQL负责从SQL Server数据库中加载数据
最后,实体框架是一个系统,您可以在其中定义XML格式的数据库和对象映射,然后可以使用Linq查询通过此映射加载的数据。