我很好奇LINQ(不是LINQ to SQL)在后台执行的连接与Sql Server执行连接的方式究竟有何不同。
SqlServer在执行查询之前,会生成一个执行计划。执行计划基本上是一个表达式树,它认为这是执行查询的最佳方法。每个节点都提供有关是否执行排序,扫描,选择,合并等信息。
在执行计划的“加入”节点上,我们可以看到三种可能的算法:哈希联接,合并联接和嵌套循环联接。Sql
Server将根据内部表和外部表中的预期行数,我们正在执行的联接类型(某些算法不支持所有联接类型),是否需要对数据排序来为每个联接操作选择哪种算法。可能还有许多其他因素。
联接算法:
嵌套循环连接:最适合小输入,可通过有序内部表进行优化。
合并联接:最适合大中型输入,已排序的输入或需要订购的输出。
哈希联接:最适合大中型输入,可以并行化以线性扩展。
LINQ查询:
DataTable firstTable, secondTable;
...
var rows = from firstRow in firstTable.AsEnumerable ()
join secondRow in secondTable.AsEnumerable ()
on firstRow.Field<object> (randomObject.Property)
equals secondRow.Field<object> (randomObject.Property)
select new {firstRow, secondRow};
SQL查询:
SELECT *
FROM firstTable fT
INNER JOIN secondTable sT ON fT.Property = sT.Property
如果Sql
Server知道每个表中的行数很少,则可以使用嵌套循环联接;如果知道表中的一个表具有索引,则可以使用合并联接;如果知道每个表中都有很多行,则可以使用Hash联接。表,并且都没有索引。
Linq是否选择其加入算法?还是总是使用一个?
Linq to SQL不会将连接提示发送到服务器。因此,使用Linq to SQL的联接的性能将与“直接”发送到服务器(即使用纯ADO或SQL Server
Management Studio)的同一联接的性能相同,而没有指定任何提示。
Linq to SQL也 不允许
您使用联接提示(据我所知)。因此,如果要强制执行特定类型的联接,则必须使用存储过程或Execute[Command|Query]
方法来执行。但是,除非您通过编写来指定INNER [HASH|LOOP|MERGE] JOIN
联接类型,否则SQL Server始终会选择它认为最有效的联接类型-查询的来源无关紧要。
其他Linq查询提供程序(例如Entity Framework和NHibernate Linq)将执行与Linq to
SQL完全相同的操作。这些都没有直接了解如何为数据库建立索引的知识,因此它们都没有发送连接提示。
Linq to Objects有点不同-在SQL Server中,它将(几乎?)始终执行“哈希联接”。这是因为它缺少执行合并联接所需的索引,并且哈希联接
通常
比嵌套循环更有效,除非元素的数量很小。但是首先确定一个元素中的元素数量IEnumerable<T>
可能需要完整的迭代,因此在大多数情况下,假设最坏的情况并使用哈希算法会更快。
问题内容: 没有使用foreach循环就可以针对以下问题定义LINQ语句吗? 在写这个问题时,我找到了解决问题的办法。我仍然会发布(并回答)这个问题,因为这个问题对我来说真是个麻烦。而且我在这里没有找到合适的现有问题。 乔,尤文 问题答案: 相信and可以解决这个问题! 第二个变量名称具有误导作用。除其他字母外,它还会返回的一个实例,该实例在原始集合中 不是 唯一的;)
问题内容: 我目前正在使用LINQ的C#项目中工作。我想知道是否有可能用Linq创建一个“多重OR子句”,并以列表作为where的条目。 我的意思是这样的: 关于如何做到这一点的任何想法? 谢谢 问题答案: 您可以使用包含
大多数应用程序都是以数据为中心的,但大多数数据存储库都是关系数据库。 多年来,设计人员和开发人员基于对象模型设计了应用程序。 对象负责连接到数据访问组件 - 称为数据访问层(DAL)。 在这里我们要考虑三点: 应用程序中所需的所有数据都不存储在同一个源中。 源可以是关系数据库,某些业务对象,XML文件或Web服务。 访问内存中对象比从数据库或XML文件访问数据更简单,更便宜。 访问的数据不直接使用
$linq 是 .NET 库 LINQ 的 JavaScript 版,支持查询、条件查询、排序、distinct、分组、联合和排除查询等。 $linq 同时实现了一些来自 MoreLinq 中的方法,可与 jQuery 的集合和数组协作。 示例程序: var people = [{ Name: "Senthil Kumar"}, { Name: "Norton Stanley"},
语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。 传 统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,您还必须针对以下各种数据源学习不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。LINQ 使查
问题内容: 编辑: 直到这里,我得到适当的4行,但它们都是相同的结果(我知道我需要4行,但是有不同的结果) 我的问题是,如何仅通过LotteryOfferId来通过多对多表检索所有彩票? 我要实现的是通过LotteryDrawDateId从彩票表中获取数据。 首先,我使用LotteryOfferId从中间表获取DrawDates,然后通过中间表获取drawDateIds以在LotteryDrawD