如何使用LINQ2SQL在跨数据库查询中排除大量记录?

时间:2010-06-08 03:16:52

标签: linq-to-sql

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

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

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

必须撤回大量不相关的记录,只是为了排除它们,所以我可以得到正确的250条记录似乎非常不优雅。有没有更好的方法来做这个,没有做跨数据库存储过程?

提前致谢。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我可能建议首先查询供应商数据库,首先按某种标准排序结果(可能是日期字段,最旧到最近)。

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

答案 2 :(得分:0)

如果您拥有对运行供应商数据库的SQL Server的db-create访问权限(或者您的自定义数据库位于同一服务器上),则可以在其他数据库中创建“已导入”表相同的服务器,然后编写一个存储的proc,对该供应商数据库执行该表的跨数据库连接,例如:

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中...