C# 错误:";指定的LINQ表达式包含对与不同上下文关联的查询的引用;
我从一个LINQ查询接收到标题中显示的错误,该查询包含来自两个不同edmx文件的两个表。以下是查询:C# 错误:";指定的LINQ表达式包含对与不同上下文关联的查询的引用;,c#,entity-framework,linq,edmx,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
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文件关联的上下文。如何克服此错误?您需要将第二个表添加到第一个上下文的模型中。如果这是在多个数据库中进行的,则需要使用Linq to Objects join在客户端执行辅助查找。您必须执行两个数据库查询:
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可用,而EDMX又意味着单个连接字符串。有几种方法可以实现这一目标:
- 如果两个表位于同一数据库中,请将它们都添加到单个EDMX中
- 如果它们位于不同的数据库上,但位于同一实例上,请在其中一个数据库上创建一个从另一个数据库的表中选择的视图,然后将本地表和视图添加到单个EDMX
- 如果它们位于不同的实例/服务器上,请创建链接服务器,然后在链接服务器上创建表的视图,然后将本地表和视图添加到单个EDMX
谢谢你的回复。你能告诉我更多的细节吗?我需要更多的细节来说明你为什么要使用多个EDMX文件来决定该怎么做。Allon,你介意看看我的问题吗?两个表位于同一个EDMX中。非常感谢。非常清楚地解释了解决方案和可能的替代方案-谢谢。
<add name="MyConnection"
connectionString="metadata=res://*/Entities.ModuleA.csdl|res://*/Entities.ModuleA.ssdl|res://*/Entities.ModuleA.msl|res://*/Entities.ModuleB.csdl|res://*/Entities.ModuleB.ssdl|res://*/Entities.ModuleB.msl;
provider=System.Data.SqlClient;provider connection string="MyConnectionString""
providerName="System.Data.EntityClient" />
using (EntityConnection oEntityConnection =
new EntityConnection("name=MyConnection"))
{
using(DbContext oDBContext = new DbContext(oEntityConnection))
{
//your code - available are entities declared in Entities.ModuleA and Entities.ModuleB
}
}
using (EntityConnection oEntityConnection =
new EntityConnection(new MetadataWorkspace(
new string [] {
"res://Entities.ModuleA/",
"res://Entities.ModuleB/"
},
new Assembly[] {
Assembly.GetAssembly(typeof(Entities.ModuleA.AnyType)),
Assembly.GetAssembly(typeof(Entities.ModuleB.AnyType))
}
)))
{
using(DbContext oDBContext = new DbContext(oEntityConnection))
{
//your code - available are entities declared in Entities.ModuleA and Entities.ModuleB
}
}