【问题标题】:LINQ to SQL ToList() is creating duplicates and dropping entriesLINQ to SQL ToList() 正在创建重复项并删除条目
【发布时间】: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


【解决方案1】:

此问题是由未将 ID 字段标记为 IsPrimaryKey=True 引起的。在正确标记 ToList() 方法不再表现异常之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多