【问题标题】:How can you exclude a large number of records in a cross db query using LINQ2SQL?如何使用 LINQ2SQL 在跨数据库查询中排除大量记录?
【发布时间】:2010-06-08 11:39:21
【问题描述】:

这就是我的情况:我有一个供应商提供的我们无法修改的数据库,以及一个从供应商应用程序导入数据并对其进行操作的自定义数据库。一旦从供应商应用程序导入记录,它们就不能出现在要导入的记录列表中。此外,我们只想显示尚未导入的 250 条最新记录。

我最初是选择从自定义数据库中导入的 id 列表,然后使用 .Where(x => !idList.Contains(x.远程查询上的 Id)) 子句。

直到我们打破了导入自定义数据库的 2100 条记录,因为 2100 是可以传递到 SQL 的参数数量的限制。在发现这是实际问题而不是 ADO.Net 报告的“无效缓冲区”/“严重错误”后,我的解决方案是删除远程查询中的前 2000 个 id,然后删除本地查询中的剩余记录。

不得不拉回大量不相关的记录,只是为了排除它们,这样我才能得到正确的 250 条记录,这似乎很不雅。除了执行跨数据库存储过程之外,还有更好的方法吗?

提前致谢。

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    这可能不是最佳答案,具体取决于您要处理的记录数,但您可以强制 SQL 执行并将其作为内存对象处理。调用ToList() 方法将执行 SQL 并转换为 IEnumerable 。

    【讨论】:

    • 对,这可能是最简单的方法,但似乎很浪费。我的案例现在有 2 万条记录,但这个数字每天都在增长。在你达到几百个记录之前可能没什么大不了的,但我不确定供应商数据库一直被供应商应用程序使用,并且没有好的方法来模拟日常使用。
    • 您还可以将密钥导入数据库中的表并在那里进行连接。按需或定期。
    【解决方案2】:

    我的建议是先查询供应商数据库,然后按照某种标准(可能是日期字段,从最早到最近)对结果进行排序。

    您可以执行 Skip().Take() 来“浏览”结果,然后获取每个批量集并将它们插入到 ID 尚不存在的自定义数据库中。这样就可以避免现在遇到的问题。

    【讨论】:

    • 是的,这是我考虑过的,但是我不希望同步 2 个数据库的混乱或麻烦,因为供应商数据库每天都会更新。对于某些情况,这是一个可行的解决方案,但不是我的。
    【解决方案3】:

    如果您对运行供应商数据库的 SQL Server 具有 db-create 访问权限(或者如果您的自定义数据库在同一台服务器上),您可以在该数据库上的不同数据库中创建一个“已导入”表同一台服务器,然后编写一个存储过程,对该表与供应商数据库进行跨数据库连接,例如:

    select top 250 from vendordb.to_be_imported
    where not exists 
    (select 1 from customdb.has_been_imported where idWasImported = idToBeImported)
    order by whatever;
    

    您甚至可以在 Linq 2 SQL 中执行此操作——我从未尝试将来自不同数据库的对象添加到单个 DataContext...

    【讨论】:

    • 这可能是性能很重要的最佳解决方案(同样,我无法测试)。但是,这并不是我真正想要的,因为我想知道是否有办法在没有跨数据库 SP 的情况下做到这一点。
    • @tap 哦,是的,所以你做到了——对不起。顺便问一下,您使用的是哪个版本的 SQL Server? 2005 年还是 2008 年?
    猜你喜欢
    • 2010-11-01
    • 2019-04-14
    • 2015-11-28
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多