当处理内存中的DataTable时,有关何时应使用DataTable.Select和LINQ Select的建议是什么?
我发现LINQ语法更容易且更强大,但我不确定是否存在性能或其他问题使得DataTable select更可取。
(我正在使用一个第三方API,该API提供了一个已从数据库预填充的DataTable。我需要在内存中进一步过滤它。)
当处理内存中的DataTable时,有关何时应使用DataTable.Select和LINQ Select的建议是什么?
我发现LINQ语法更容易且更强大,但我不确定是否存在性能或其他问题使得DataTable select更可取。
(我正在使用一个第三方API,该API提供了一个已从数据库预填充的DataTable。我需要在内存中进一步过滤它。)
根据个人经验,我尽量避免使用Datatable.Select。我发现它运行缓慢并且存在一些奇怪的错误。
我遇到的一个问题是,当语句中有括号时,DataTable.Select不总是正确地评估AND条件。(这已经被微软证实和记录下来)
例如,(Col1 > 1)AND(Col < 10)可能无法返回正确的答案,而Col1 > 1 AND Col < 10将正常工作。
这个bug不会在每台电脑上都出现。在我的情况下,我正在使用的检查在我的开发平台和除了一个客户端电脑外的所有客户端电脑上都可以正常运行。在我发现这个bug之后,我开始转向使用LINQ进行选择,并注意到操作速度显着提高。
顺便说一句:不用长篇解释,我们公司不使用数据库存储数据。我们所有与DataTable相关的操作都涉及从平面文件加载的内存中的表。因此,我谈论的不是LINQ 2 SQL,而是LINQ to Dataset。
即使不提及LINQ,我也不会在任何情况下使用DataTable.Select,除非我绝对必须这样做,因为在大多数情况下,这意味着在客户端执行应该在数据库中执行的操作。
更新:我的答案可能有些夸张。有时候使用DataTable作为(希望)小型内存数据库以最小化客户端到数据库的往返是有合法理由的。
DataTable.Select
假定你已经填充了数据表中的数据。这可能会导致糟糕的设计,在客户端加载比你需要更多的数据,只是为了进行筛选。让 SQL Server 为您查询数据,并处理其返回的结果集。L2S 只有在迭代集合时才从数据库读取数据,因此更容易在与数据库交互之前制定查询。