【发布时间】:2015-03-21 14:05:20
【问题描述】:
使用实体框架,我试图解决 Linq 无法处理来自不同数据库的表之间的连接这一事实。数据库:
DB1.dbo.Table1:Id,XmlText
DB2.dbo.Table2:Id、TimeStamp、ColA、ColB...
我想在Table2中找到XmlText中某个属性设置为true的行,即XmlText包含'xmlProp=true'
在 SQL 中,我会简单地写
SELECT *
FROM [DB2].[dbo].[Table2]
INNER JOIN [DB1].[dbo].[Table1] ON [Table1].Id = [Table2].Id
WHERE XmlText like '%xmlProp=true%'
由于我不能在 Linq 中使用 join(不同的数据库,记得吗?),我正在这样做:
var query = from t1 in db1.Table1
where db1.Text.Contains('<xmlProp>false</xmlProp>)
select t1.Id;
var set = new HashSet<Guid>();
foreach (var elem in query)
set.Add(elem);
var query2 = from t2 in db2.Table2
where !set.Contains(t2.Id)
select t2;
我当然可以搜索 'true',但更少的行有 false,所以集合会更小,从而提高性能。
现在:有没有更好的方法来做到这一点?生成的 SQL 查询非常庞大(要避免的一长串 ID ......),将 ID 存储在内存中只是为了再次将它们传回 SQL 服务器感觉很愚蠢。有人吗?
谢谢, M
【问题讨论】:
-
stackoverflow.com/questions/352949/… 您需要定义要针对特定表访问的数据库,或者提供两个不同的数据上下文,以便您可以辨别哪个 database.table 是哪个。
-
意识到我忘了提到我正在使用实体框架......所以我没有 dbml 文件可以按照您的链接中的建议进行编辑。另外,我不能在一个查询中使用两个上下文,对吧?
标签: sql-server database linq join contains