问题 DataTable Select vs LINQ Select


有关何时的任何建议 DataTable.Select 应该用来对抗 LINQ选择 在处理内存中的DataTable时?

我发现LINQ语法更容易,更强大,但我不确定是否存在使DataTable选择更好的性能或其他问题。

(我正在使用第三方API,它提供了一个已从数据库中预先填充的DataTable。我需要在内存中进一步过滤。)


2532
2017-09-14 14:45


起源



答案:


根据个人经验,我尽量避免使用Datatable.Select。我发现它很慢并且有一些奇怪的错误。

我遇到的一个(由Microsoft确认并记​​录)的错误是,当语句中有括号时,DataTable.Select并不总是正确评估AND条件。

例如,(Col1> 1)AND(Col <10)可能无法返回正确的答案, 而Col1> 1和Col <10将正常工作。

每个计算机上都没有显示此错误。在我的情况下,我使用的检查在我的开发平台和每个客户端计算机上运行正常,除了一个。在我发现这个错误后,我开始转向使用LINQ进行选择,并注意到操作速度的显着提高。

附注:我的公司没有进行长时间的解释,也没有使用数据库来存储数据。 所有 我们对DataTables的操作涉及从平面文件加载的内存表。所以我不是在谈论LINQ 2 SQL,而是LINQ to Dataset。


9
2017-09-14 15:10





甚至没有提到LINQ,我也不会使用DataTable.Select 随地 除非我绝对不得不这样做,因为在大多数情况下,这意味着在客户端执行应该在数据库中执行的操作。

更新:我的回答可能有点过分夸大了。那里  有时使用DataTable作为(希望)小型内存数据库的合法原因可以最大限度地减少客户端到数据库的往返次数。


2
2017-09-14 14:49



绝对 - 虽然这是'绝对必须'的情况。使用第三方API。 - Alex Angas


答案:


根据个人经验,我尽量避免使用Datatable.Select。我发现它很慢并且有一些奇怪的错误。

我遇到的一个(由Microsoft确认并记​​录)的错误是,当语句中有括号时,DataTable.Select并不总是正确评估AND条件。

例如,(Col1> 1)AND(Col <10)可能无法返回正确的答案, 而Col1> 1和Col <10将正常工作。

每个计算机上都没有显示此错误。在我的情况下,我使用的检查在我的开发平台和每个客户端计算机上运行正常,除了一个。在我发现这个错误后,我开始转向使用LINQ进行选择,并注意到操作速度的显着提高。

附注:我的公司没有进行长时间的解释,也没有使用数据库来存储数据。 所有 我们对DataTables的操作涉及从平面文件加载的内存表。所以我不是在谈论LINQ 2 SQL,而是LINQ to Dataset。


9
2017-09-14 15:10





甚至没有提到LINQ,我也不会使用DataTable.Select 随地 除非我绝对不得不这样做,因为在大多数情况下,这意味着在客户端执行应该在数据库中执行的操作。

更新:我的回答可能有点过分夸大了。那里  有时使用DataTable作为(希望)小型内存数据库的合法原因可以最大限度地减少客户端到数据库的往返次数。


2
2017-09-14 14:49



绝对 - 虽然这是'绝对必须'的情况。使用第三方API。 - Alex Angas


嗯,你在比较数据集吗? LINQ to SQL?如果你是,那么我会说沟渠数据集并与L2S一起使用。 DataTable.Select 假设您已经使用数据填充了数据表。这可能导致设计错误,您加载的数据超出了您的需求,只需在客户端进行过滤即可。让SQL Server为您进行查询,并处理它为您提供的结果集。只有在迭代集合时,L2S才会从数据库中读取数据,因此制定查询要容易得多 之前 点击数据库。

LINQ to SQL引入了一些调试开销,因为从中获取动态生成的SQL可能很难(而在数据集中,您首先提供SQL),但在几乎所有其他情况下,它都更加优雅。该 延期装载 功能特别有用。

如果您不使用数据库,那么我仍然更喜欢LINQ(特别称为 LINQ to Objects在这种情况下)在数据集上。语法更容易,并且因为没有魔术字符串(即SQL语句),所以它更容易测试,并且你得到错别字的编译时警告等。


0
2017-09-14 14:47



感谢您的回答。我应该明确表示我没有与数据库进行交互。我会更新这个问题。 - Alex Angas
啊公平的。我在此基础上更新了我的答案。 - Neil Barnwell