DataTable Select与LINQ Select对比

12

当处理内存中的DataTable时,有关何时应使用DataTable.SelectLINQ Select的建议是什么?

我发现LINQ语法更容易且更强大,但我不确定是否存在性能或其他问题使得DataTable select更可取。

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

3个回答

12

根据个人经验,我尽量避免使用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。


2

即使不提及LINQ,我也不会在任何情况下使用DataTable.Select,除非我绝对必须这样做,因为在大多数情况下,这意味着在客户端执行应该在数据库中执行的操作。

更新:我的答案可能有些夸张。有时候使用DataTable作为(希望)小型内存数据库以最小化客户端到数据库的往返是有合法理由的。


当然可以-尽管这是一个“必须如此”的情况。与第三方API一起工作。 - Alex Angas

0
嗯,你是在使用 LINQ to SQL 比较数据集吗? 如果是的话,那么我建议放弃使用数据集并选择 L2S。 DataTable.Select 假定你已经填充了数据表中的数据。这可能会导致糟糕的设计,在客户端加载比你需要更多的数据,只是为了进行筛选。让 SQL Server 为您查询数据,并处理其返回的结果集。L2S 只有在迭代集合时才从数据库读取数据,因此更容易在与数据库交互之前制定查询。
LINQ to SQL 引入了一些调试开销,因为很难将动态生成的 SQL 取出来(而在数据集中,您首先提供 SQL),但在几乎所有其他情况下,它都更加优雅。 延迟加载 功能尤其有用。
如果您没有使用数据库,那么我仍然更喜欢在数据集方面使用LINQ(在这种情况下特别称为LINQ to Objects)。语法更简单,因为没有魔术字符串(即SQL语句),所以更容易测试,并且可以获得编译时警告以避免拼写错误等问题。

谢谢您的回答。我应该先说明一下,我没有与数据库进行交互。我会更新问题的描述。 - Alex Angas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接