2013-01-15 5 views
1

내보기에 표시 할 데이터에 대한 ViewModel을 만들려고합니다. 문제는 표시되는 데이터가 2 개의 데이터베이스와 각각의 여러 테이블에 분산되어 있다는 것입니다. 나는 당신이 여러 문맥에서 Linq 쿼리에 합류 할 수 없다는 것을 읽었으며 이해하기 쉽다. 또한 나는 EF5에서 Code-First를 사용하여 Stored Procedures를 사용할 수 없다는 것을 읽었다. Linq가 하나의 ViewModel에 쿼리하고 결합하려고합니다 ... 어떻게해야하는지 모르겠습니다.여러 컨텍스트에서 LINQ 쿼리에 가입

여기 내 LINQ 쿼리의 :

var csdContext = new CSDContext(CustomerCode); 
var masterContext = new MasterContext(); 

//Only returns 1 row - which is what we want. 
List<Site> sites = (from s in csdContext.Sites 
       join sa in csdContext.SiteAddresses 
        on s.SiteID equals sa.SiteID 
       join a in csdContext.Addresses 
        on sa.AddressID equals a.AddressID 
       join spv in csdContext.SiteProductVersions 
        on s.SiteID equals spv.ProductVersionID 
       where s.SiteID == id 
       select s).ToList(); 

//List 
List<States> states = (from s in masterContext.StatesTable 
        select s).ToList(); 

내 뷰 모델은 다음과 같습니다 : 기본적으로

public class SiteDetailsViewModel 
{ 
    public string Address { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string StateCode { get; set; } 
    public string ZipCode { get; set; } 
    public string OfficePhone { get; set; } 
    public string MobilePhone { get; set; } 
    public string AlternativePhone { get; set; } 
    public int ProductVersionID { get; set; } 
} 

, 나는이 테이블에서 다음 데이터를 필요
csdContext이 -
주소를 주소
주소 2
도시
우편 번호

csdContext - 사이트
OfficePhone과
모바일 폰
AlternativePhone

csdContext - SiteProductVersions
ProductVersionID

masterContext - 미국
StateCode 여기

은 테이블이 SQL에 가입하는 방법은
:

SELECT csd_a.Address, csd_a.Address2, csd_a.City, mstr_st.StateCode, csd_a.ZipCode, csd_s.OfficePhone, csd_s.MobilePhone, 
csd_s.AlternativePhone, csd_spv.ProductVersionID 
FROM CSD.dbo.Sites AS csd_s 
INNER JOIN CSD.dbo.SiteAddress AS csd_sa ON csd_sa.SiteID = csd_s.SiteID 
INNER JOIN CSD.dbo.Address AS csd_a ON csd_a.AddressID = csd_sa.AddressID 
INNER JOIN CSD.dbo.SiteProductVersions AS csd_spv ON csd_s.SiteID = csd_spv.SiteID 
INNER JOIN MasterDB.dbo.States AS mstr_st ON mstr_st.StateID = csd_a.StateID 

내가 SiteDetailsViewModel의 뷰 모델 데이터를 작성하는이 3 개 결과를 병합하는 방법을 알아낼 수 없습니다 . 누구든지 도와 줄 수 있습니까?

+0

첫 번째 쿼리에서'join'을 사용하고 다른 컨텍스트를 넣지 못하게하는 이유는 무엇입니까? – AgentFire

+0

EF로 다른 컨텍스트에서 조인 할 수 없습니다. – Robert

답변

1

당신이 당신의 쿼리를 실현 경우이를 사용할 수 있습니다

var query = sites.Join(
      states, 
      si => si.StateID, 
      st => st.StateID, 
      (si, st) => new SiteDetailsViewModel 
         { 
          Address = si.Address, 
          Address2 = si.Address2, 
          City = si.City, 
          StateCode = st.StateCode, 
          ZipCode = si.ZipCode, 
          OfficePhone = si.OfficePhone, 
          MobilePhone = si.MobilePhone, 
          AlternativePhone = si.AlternativePhone, 
          ProductVersionID = siProductVersionID 
         }); 
+0

OP에서 설명한대로 코드를 사용하면 알 수 없습니다. ToList()는 쿼리가 구체화되었으며 컨텍스트에 이미 연결되어 있지 않습니다.그들은 단지 메모리에있는 목록 일뿐입니다. –

+0

고맙습니다. – Robert

-1

은 왜이처럼 쓰지 않는다 : OP에 설명 된대로

from ... 
... 
where s.SiteID == id 
select new SiteDetailsViewModel() 
{ 
    Address = sa.Address, 
    Address2 = as.Address2, 
    .. 
} 
+0

다른 컨텍스트에있는 States 테이블의 "StateCode"가 필요하기 때문입니다. – Robert

+0

질문은 "..."부분에 관한 것입니다. –

0

한 가지 가능한 대안 솔루션을 만드는 것입니다 DB # 1의 테이블 중 DB # 2의 뷰. 그런 다음 DB # 2의 EF에서 해당 뷰를 모델링하거나 매핑 할 수 있습니다. 물론 테이블을 업데이트해야하는 경우 DB # 1에 대한 컨텍스트가 필요합니다. 그러나이 솔루션의 장점은 단일 컨텍스트에서 모든 읽기 액세스를 수행 할 수 있고 메모리가 아닌 서버에서 조인 할 수 있다는 것입니다.