我已经花了很长时间在LINQ上工作。然而,它们之间的真正区别仍然是个谜。
成功的答案将包含它们之间的简要区分。每个类型的主要目标是什么,有什么好处,并且是否会对性能产生影响...
P.S. 我知道那里有很多信息来源,但我正在寻找一种“作弊表”,指导新手为实现特定目标去哪里。
它们中的所有方言都是针对 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 语法查询这些数据。
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查询比通过网络加载整个数据库,然后在客户端进行筛选更快。两者都有理想情况和明显错误的情况。
这里的目标和好处是允许您使用单个静态检查的语法查询各种数据源,并使代码更具表现力(例如,“传统”代码分组数据并不清楚它试图做什么 - 它在大量代码中迷失了方向)。
LINQ是语言集成查询的缩写。它允许您直接在C#中使用“SQL风格”的查询语言从数据源中提取信息。
该数据源也可以是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查询通过此映射加载的数据。