c# - 错误 : "The specified LINQ expression contains references to queries that are associated with different contexts"

标签 c# entity-framework linq edmx

我从 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()


你的后续问题:

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/

相关文章:

c# - 为什么使用 PUBSUB 订阅时无法 PING 通?

entity-framework - 使用 EF 6 查找并包含

c# - Entity Framework 引发无效操作异常 - app.config 中未找到连接字符串

entity-framework - 对 3 层架构中的数据访问层进行单元测试

c# - 在 Linq-SQL 查询上添加不确定数量的 AND?

c# - SaveChange 不起作用后刷新数据源

c# - 将对象转换为 CSV 字符串

c# - 嵌套组 Linq 查询与 Groupby 扩展方法

.net - LINQ 是否在幕后进行迭代?

c# - 调用其他函数时减少 if 语句