Development Tip

오류 : "지정된 LINQ 식에 다른 컨텍스트와 연결된 쿼리에 대한 참조가 포함되어 있습니다."

yourdevel 2020. 12. 11. 20:24
반응형

오류 : "지정된 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=&quot;MyConnectionString&quot;"
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
        }
    }

참고 URL : https://stackoverflow.com/questions/7332920/error-the-specified-linq-expression-contains-references-to-queries-that-are-as

반응형