【问题标题】:How to identify set of records to be deleted using LinqToSql where not in another set?如何使用 LinqToSql 识别要删除的记录集,而不是另一组?
【发布时间】:2011-11-28 11:15:01
【问题描述】:

我有一个每日 XML 提要,其中包含每天的所有记录。这些需要处理并加载到数据库中,即那些未包含在第 2 天的提要中但在第 1 天提要中的那些应该被删除,并且任何差异都应该导致数据库的更新。我目前的方法是使用处理日期更新每个包含的记录,然后删除当天未处理的所有记录。

但是这需要每天更新每条记录,我想知道是否有更好的方法?

我目前加载 XML 文件并在我的 dbcontext 中查找当前存在于 xml 中的每条记录的每条记录,如下所示:

return (from venue in db.Venues 
where venue.id = xmlVenueId
select venue).FirstOrDefault();

如果存在,则使用当前 xml 文件信息更新所有字段,如果不存在,则创建一个新字段。如果所有字段都相同,则不会更新数据库。

处理完所有记录后,我需要删除所有未受影响的记录。

我应该如何形成所有找到的场所的列表(我应该提取主键然后添加到列表还是获取整个场所)以及 linq2Sql 查询会是什么样子以查找不在此列表中的所有记录?

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    不确定这是不是最好的方法,但它似乎有效:

    我创建一个List<int> venuePrimaryKeys 然后执行以下查询:

    from venue in db.Venues
    where ! venuePrimaryKeys.Contains(venue.id)
    select venue
    

    然后我可以遍历结果列表中的结果 IQueryableDeleteOnSubmit 每个场地。

    【讨论】:

    • 这种方法存在问题,因为它会转换为 WHERE IN () SQL 查询。并且 IN 子句看起来像 (@P1, @P2, ... @Pn) 即,venuePrimaryKeys 中的所有元素都将作为参数发送,参数限制为 ~2000 左右。这意味着如果venuePrimaryKeys 是一个大集合,这种方法将是有问题的。
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多