【发布时间】:2014-04-17 20:28:20
【问题描述】:
在我的代码中,我试图用表格的内容填充用户定义的表格。目前,我正在使用 LINQ to SQL 将 SQL 表的内容拉入列表,然后将该列表转换为 DataTable 以用作 UDT 参数。我遇到了一个错误,其中 DataTable 以重复条目结束,并且丢失了原始 SQL 表中存在的一些条目。
我分解了这个过程,并确定在从 SQL 表生成原始列表时出现了问题。
在附图中,您可以看到我使用 linq 查看 db.job_41000s 中是否存在特定记录。然后我将结果打印出来,结果为真。之后,我将 db.job_4100s 拉入一个 List 变量 joblist。然后我用 linq 搜索 joblist 以找到相同的特定记录并将结果写入输出窗口,结果返回 false。
这怎么会发生?
~编辑:
此屏幕截图显示了从 linq 语句生成的 SQL 查询。在我看来,没有什么不寻常的。对于它的价值,两个结果都应该是“真”。该记录肯定存在于 SQL 服务器中。
我解决了这个问题,但如果有人有任何想法,我仍然想知道为什么这会破坏它。 job_41000 映射没有 ID 作为主键。正确地将其设置为主键的一部分解决了这个问题。但是我不明白为什么不将它作为主键会导致 ToList 函数行为异常。
【问题讨论】:
-
请注意区分大小写。大多数情况下,数据库设置为在查询时忽略大小写,而在内存中比较默认情况下区分大小写。
-
这很可能是由于 SQL 比较项目的方式与 .NET 比较内存中项目的方式不同。例如,您的数据库可能设置为以不区分大小写的方式进行字符串比较,而 C# 的
==区分大小写。 -
我添加了另一个图像来显示生成的 SQL 查询。在这种情况下,使用的“案例”完全如图所示。它在 SQL Server 中存储为 DC14-040001751。我正在尝试从 SQLServerA 表 Jobs 中获取数据并将其放入 SQLServerB 表 Jobs 中。在 VPN 上执行“插入 SQLA.jobs SELECT * FROM SQLB.jobs”之类的操作花费的时间太长,解决方案是在 SQLB 上创建一个接受用户定义表的过程。当我在这种情况下运行该过程时,它从 SQLA 中的作业中获取数据,并在尝试将其输入 SQLB 时因重复键错误而失败。它们具有相同的索引。
标签: c# sql sql-server linq linq-to-sql