我已经和LINQ一起工作了很长一段时间。但是,提到的LINQ风格之间存在真正的差异仍然有点神秘。
成功的答案将包含它们之间的短暂区别。每种口味的主要目标是什么,有什么好处,是否会对性能产生影响......
P.S。 我知道有很多信息来源,但我正在寻找一种“备忘单”,它指示新手在哪里寻找特定目标。
答案 0 :(得分:105)
所有这些都是LINQ - 语言集成查询 - 所以它们都有很多共性。所有这些“方言”基本上允许您从各种来源进行查询式数据选择。
Linq-to-SQL 是Microsoft首次尝试使用ORM - 对象关系映射器。它仅支持SQL Server。它是一种将SQL Server数据库表映射到.NET对象的映射技术。
Linq-to-Entities 是一样的想法,但在后台使用Entity Framework,作为ORM - 再次来自Microsoft,但支持多个数据库后端
Linq-to-DataSets 是LINQ,但使用的是“旧式”ADO.NET 2.0数据集 - 在ORM来自Microsoft之前的时代,你所能做的就是ADO.NET返回DataSets,DataTables等,Linq-to-DataSets查询这些数据存储的数据。因此,在这种情况下,您将从数据库后端返回DataTable或DataSets(System.Data命名空间),然后使用LINQ语法查询这些
答案 1 :(得分:36)
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到对象,包括LINQ到数据集),或到表达式树(表示对象模型中的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查询返回少量数据比通过网络加载整个数据库然后在客户端进行过滤更快。但是,两者都有理想的场景和明显错误的场景。
这里的目标和好处是允许您使用单个静态检查语法来查询各种数据源,并使代码更具表现力(例如,“传统”代码将数据分组,在它试图做的事情上并不是很清楚 - 它在大量的代码中丢失了。)
答案 2 :(得分:25)
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查询通过此映射加载的数据。