我从 LINQ 查询中收到标题中显示的错误,该查询包含来自两个不同 edmx 文件的两个表。这是查询:
var query = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == "new"
select new
{
Id = a.Id,
CompanyId = (from c in db2.Company
where s.Id == a.Id
select
new { c.CompanyId })
});
db1
和 db2
是与两个不同的 edmx 文件关联的上下文。我该如何克服这个错误?
最佳答案
您必须执行两个数据库查询:
var IDs = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == "new"
select new a.Id).ToArray();
var query = from c in db2.Company
join a in IDs on c.Id equals a.Id
select new { Id = a.Id, CompanyId = c.CompanyId };
.ToArray()
至关重要。它会阻止 EF 尝试执行组合查询(这将失败,因为它使用两个不同的上下文)。如果您希望保持延迟加载,可以使用 .AsEnumerable()
。
你的后续问题:
Is there any other way to make the LINQ query more optimized? That is, to perform the action in a single LINQ query itself?
为了使您的原始查询成功运行,它必须仅使用单个数据上下文,这意味着所有数据必须可从单个 EDMX 获得,这又意味着单个连接字符串。您可以通过多种方式实现这一目标:
- 如果两个表都在同一个数据库中,则将它们都添加到一个 EDMX 中。
- 如果它们在不同的数据库上但在同一个实例上,则在其中一个数据库上创建一个 View ,该 View 从另一个数据库上的表中选择,然后将本地表和 View 添加到单个 EDMX。
- 如果它们在不同的实例/服务器上,则创建链接服务器,然后在链接服务器上创建表的 View ,然后将本地表和 View 添加到单个 EDMX。
关于c# - 错误 : "The specified LINQ expression contains references to queries that are associated with different contexts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332920/