错误:“指定的LINQexpression式包含对与不同上下文关联的查询的引用”

我收到来自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 }) }); 

db1db2是与两个不同的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()如果你想保持延迟加载。


而你的后续问题:

有没有其他的方法来使LINQ查询更优化? 也就是说,要在一个单独的LINQ查询本身中执行该操作?

为了使您的原始查询成功运行,它必须只使用一个数据上下文,这意味着所有的数据必须从一个单一的EDMX可用,而这意味着一个连接string。 有几种方法可以实现这一点:

  • 如果两个表都在同一个数据库上,则将它们都添加到单个EDMX中。
  • 如果它们在不同的数据库上,但在同一个实例上,则在其中一个数据库上创build一个视图,从另一个数据库的表中select,然后将本地表和视图添加到单个EDMX中。
  • 如果它们位于不同的实例/服务器上,则创build一个链接的服务器,然后在链接的服务器上创build表的视图,然后将本地表和视图添加到单个EDMX中。

您可能需要将第二个表添加到第一个上下文的模型中。 如果这是在多个数据库中,则需要使用Linq to Objects连接执行辅助查找客户端。