오류 : "지정된 LINQ 식에 다른 컨텍스트와 연결된 쿼리에 대한 참조가 포함되어 있습니다."
두 개의 다른 edmx 파일에서 두 개의 테이블을 포함하는 LINQ 쿼리에서 제목에 표시된 오류가 표시됩니다. 다음은 쿼리입니다.
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()
지연로드를 유지하려는 경우 사용할 수 있습니다 .
그리고 당신의 후속 질문 :
LINQ 쿼리를 더 최적화 할 수있는 다른 방법이 있습니까? 즉, 단일 LINQ 쿼리 자체에서 작업을 수행하려면?
원래 쿼리를 성공적으로 실행하려면 단일 데이터 컨텍스트 만 사용해야합니다. 즉, 단일 EDMX에서 모든 데이터를 사용할 수 있어야합니다. 즉, 단일 연결 문자열을 의미합니다. 이를 달성 할 수있는 몇 가지 방법이 있습니다.
- 두 테이블이 동일한 데이터베이스에 있으면 둘 다 단일 EDMX에 추가하십시오.
- 다른 데이터베이스에 있지만 동일한 인스턴스에있는 경우 다른 데이터베이스의 테이블에서 선택한 데이터베이스 중 하나에보기를 만든 다음 단일 EDMX에 로컬 테이블과보기를 추가합니다.
- 다른 인스턴스 / 서버에있는 경우 연결된 서버를 만든 다음 연결된 서버에서 테이블보기를 만든 다음 단일 EDMX에 로컬 테이블 및보기를 추가합니다.
첫 번째 컨텍스트의 모델에 두 번째 테이블을 추가해야합니다. 이것이 여러 데이터베이스에있는 경우 Linq to Objects 조인을 사용하여 클라이언트 측 보조 조회를 수행해야합니다.
사용하려는 모든 .EDMX의 리소스로 채워진 EntityConnection을 수동으로 만들어야합니다. app.config에 연결을 추가하거나 프로그래밍 방식으로 수행 할 수 있습니다. 그런 다음 준비된 EntityConnection을 사용하여 DBContext를 생성 할 수 있습니다.
방법 a)
<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
}
}
방법 b)
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
}
}
'Development Tip' 카테고리의 다른 글
Mercurial : 변경 사항을 어떻게 취소합니까? (0) | 2020.12.11 |
---|---|
실시간 웹 애플리케이션을위한 짧은 폴링과 긴 폴링? (0) | 2020.12.11 |
Meteor의 백그라운드 작업 (0) | 2020.12.11 |
HTML5에서 확인란을 선택하고 선택 취소하는 올바른 방법은 무엇입니까? (0) | 2020.12.11 |
ASCII "이미지"에서 "수직"정규식 일치 (0) | 2020.12.11 |