为什么Linq To Sql生成Where子句如此复杂?

时间:2009-10-06 13:53:58

标签: c# linq-to-sql

我收到一个每日XML文件,用于更新包含内容的数据库。该文件始终是一个完整的文件,即无论是否更改,都包含所有内容。我正在使用Linq2Sql来更新数据库,我正在讨论是否检查每条记录中是否有任何变化(大多数不会改变),只更新那些确实发生了变化,或只是用当前数据更新每条记录。

我觉得我需要使用每个记录的更新来访问数据库,以便我能够清除xml文件中未包含的记录。我在每条记录上设置一个处理日期,然后重新访问那些未处理的日期以删除它们。然后我想知道我是否应该在数据库中找到相应的记录广告用当前信息更新对象是否已经改变。这让我仔细研究了为更新生成的sql。我发现只有已更改的数据在update语句中设置为数据库,但我发现 WHERE子句包含记录中的所有列,而不仅仅是主键。这对于围绕系统传播的数据而言似乎非常浪费,因此让我想知道为什么会出现这种情况,以及LinqToSql上下文是否设置为仅使用子句中的主键。

所以我有两个问题:

  1. 为什么LinqToSql where子句包含所有当前数据,而不仅仅是主键?
  2. 有没有办法将上下文配置为仅使用where子句中的主键?

2 个答案:

答案 0 :(得分:2)

这是乐观并发 - 它基本上确保它不会踩到其他任何东西所做的更改。您可以通过各种方式调整并发设置,尽管我不是它的专家。

Linq to Sql optimistic concurrency的MSDN页面是一个很好的起点。

如果您有一个代表行的“版本”的列(例如自动更新的时间戳),您可以使用它 - 或者您可以在所有列上设置UpdateCheck=Never,如果您知道其他任何内容都不会更改数据。

你还没有真正描述过“你使用处理日期”来回答第三点。

答案 1 :(得分:1)

要回答#2,在dbml设计器中,在列级别为表中的每一列设置“Update Check”属性等于“Never”,以避免生成大量where子句。