3

在 SQL 中,应该始终争取基于集合的操作与基于迭代的操作(即循环)。在 .NET 中,我们经常循环集合和对象。.NET 中是否有任何命令允许基于集合的处理或一切都基于迭代?(我想起了如何遍历结果集中的每条记录的DataAdapter.Fill调用)。DataReader我不是很熟悉LINQ,但我猜它的实现只是掩盖了幕后发生的迭代。


更新:

澄清一下:我并没有声称自己是这里的任何天才,我也不会怀疑任何让我的生活编程变得更好的聪明人。我只是询问是否有执行基于集合的操作的命令,就像 SQL 在 you 时所做的那样UPDATE,而foreach(var item in obj) { ... }不是显然迭代对象。如果 SQL 开发人员使用循环,他们每时每刻都会受到责备,但在 .NET 中,我们一直都在使用它们。作为一名在 SQL 和 .NET 中大量工作的开发人员,我想问在 .NET 中是否有任何替代方案可以完全避免循环。

4

2 回答 2

5

我对 LINQ 不是很熟悉,但我猜它的实现只是掩盖了幕后发生的迭代。

你认为 SQL 是如何做到的?并不是说迭代不会发生。这是你如何在代码中表达你的意图的问题。基于集合和声明性的操作告诉平台你想要什么,然后让平台决定如何最好地做到这一点。它之所以有效,是因为允许这种代码的平台是他们所在领域的专家系统,因此比人类希望的要好得多。另一方面,命令式或过程式代码准确地告诉平台该做什么以及如何去做。这为机器优化留下了更少的空间,通常需要更多的代码,并且更容易出现错误。

于 2010-10-07T13:11:35.053 回答
0

LINQ-to-SQL 查询是真正基于集合的操作。唯一一次发生迭代是当您GetEnumerator直接或通过foreach语句调用时。

这是因为 LINQ-to-SQL 以 IQueryable<T> 开头(其中 T 是充当表的代理项的某个类),并且应用于 IQueryable<> 的每个 LINQ 操作都会返回另一个 IQueryable<>。在幕后,LINQ 根本不访问数据库,而是构建了一个越来越复杂的 LINQ 表达式。当您最终要求枚举结果时,LINQ 获取整个表达式并将其转换为 SQL 查询,该查询作为单个请求进入数据库。

于 2010-10-07T13:11:22.783 回答