"LINQ to Entities","LINQ to SQL"和"LINQ to Dataset"之间的区别是什么?

Mar*_*cel 86 c# sql linq entities dataset

我已经和LINQ一起工作了很长一段时间.但是,提到的LINQ风格之间存在真正的差异仍然有点神秘.

成功的答案将包含它们之间的短暂区别.每种口味的主要目标是什么,有什么好处,是否会对性能产生影响......

PS我知道有很多信息来源,但我正在寻找一种"备忘单",它指示新手在哪里寻找特定的目标.

mar*_*c_s 106

  • 所有这些都是LINQ - 语言集成查询 - 所以它们都有很多共性.所有这些"方言"基本上允许您从各种来源进行查询式数据选择.

  • Linq-to-SQL是微软首次尝试使用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做的就是返回DataSet,DataTables等,以及Linq -to-DataSets在数据存储中查询数据.因此,在这种情况下,您将从数据库后端返回DataTable或DataSets(System.Data命名空间),然后使用LINQ语法查询它们

  • 恭喜您达到 50k,您现在正式在 StackOverflow 上花费了太多时间。;) (2认同)
  • @Aaronaught:谢谢 - 你是绝对正确的!:-) 得给每个男人留下*一种*瘾,不是吗?请?!?!?! (2认同)
  • @Marcel:从我的直觉(没有硬性事实),我会说:Linq-to-SQL或者是最快的(数据库和对象模型之间只有一层),Linq-to-Dataset紧随其后,Linq-to -Entities是最后的,因为实体框架总是有两层映射(因此最复杂).但又一次:只是一种直觉,没有数字支持这一点 (2认同)
  • @marc_s我知道这是一个旧帖子,但在大多数情况下LINQ to Entities可能比LINQ to Dataset更快.LINQ to Dataset实际上不是一个类型,它是使用数据集作为对象的LINQ over Objects.由于LINQ over对象不执行任何SQL,因此必须首先从SQL源创建数据集,而LINQ over对象无法帮助您在将数据检索到数据集时执行任何查询优化.那些和数据集的性能非常糟糕,因为所有列都是盒装的,所有类型的移动都会导致性能下降. (2认同)

Mar*_*ell 36

LINQ是一组广泛的技术,基于(例如)查询理解语法,例如:

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;
Run Code Online (Sandbox Code Playgroud)

由编译器映射到代码中:

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
Run Code Online (Sandbox Code Playgroud)

在这里,真正的魔法开始了.请注意,我们还没有说Foo这里是什么- 编译器并不关心!只要它可以解析一些Where可以采用lambda的合适方法,并且其结果有一些 Select可以接受lambda的方法,那就很高兴了.

现在考虑拉姆达可被编译或者成一个匿名方法(委托,对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
Run Code Online (Sandbox Code Playgroud)

但它(例如,对于ADO.NET数据服务)意味着编写HTTP查询.

执行编写良好的TSQL查询返回少量数据比通过网络加载整个数据库然后在客户端进行过滤更快.但是,两者都有理想的场景和明显错误的场景.

这里的目标和好处是允许您使用单个静态检查语法来查询各种数据源,并使代码更具表现力(例如,"传统"代码用于分组数据)在它试图做的事情上非常明确 - 它在大量代码中丢失了.

  • 作为编写自己的LINQ提供商的人,这是我迄今为止看到的最佳答案.我不同意-1. (7认同)

Sim*_*ens 26

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

  • 该数据源可以是SQL服务器数据库 - 这是Linq to SQL
  • 该数据源可以是实体框架对象的数据上下文 - Linq到实体.
  • 该数据源可能是ADO.net数据集 - Linq到Dataset.

该数据源也可以是XML文件 - Linq to XML.
甚至只是一个普通对象的Collection类 - Linq to Objects.

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

有一些额外的背景:

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

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

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

  • 实际上,Linq-to-SQL只是**SQL Server** - 而不仅仅是"任何"SQL数据库后端. (3认同)
  • @marc_s:好点.谢谢.虽然,如果有人感兴趣,如果你想要的话,有第三方Linq to sql provider for other databases.请参阅http://code2code.net/DB_Linq/,或其他人使用Google.我不能评论他们的质量. (3认同)