2011-08-11 2 views
1

Entity Framework를 사용하여 관련 테이블의 정보에 액세스해야하는 데이터베이스 테이블에 대한 검색 함수를 작성하려고합니다. 그러나 부모 테이블과 관련 테이블에 대한 조인을 수행 한 후 초기 쿼리에서 데이터를 다시 가져 오는 데 문제가 있습니다. 내 코드는 현재 다음과 같습니다. 쿼리 가능한 객체를 초기화합니다.MVC에서 LINQ 조인 결과로 엔티티 개체/쿼리 가능 만들기 문제

IQueryable<PurchaseOrder> po = _context.PurchaseOrders; 

여기서 PurchaseOrder는 엔터티 유형입니다. 다음과 같은 일련의 블록이 있습니다.

if (!String.IsNullOrEmpty(searchViewModel.Comment)){ 
    var helper = _context.PurchaseOrderComments.Where(x => x.CommentText.Contains(searchViewModel.Comment)); 

    var mid = po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) => 
       new 
       { 
        PurchaseOrderID = r.PurchaseOrderID, 
        PurchaseOrderNumber = r.PurchaseOrderNumber, 
        VendorID = r.VendorID, 
        ContractNumber = r.ContractNumber, 
        BuyerUserID = r.BuyerUserID 
       }); 

    po = mid.Select(x => new PurchaseOrder 
      { 
       PurchaseOrderID = x.PurchaseOrderID, 
       PurchaseOrderNumber = x.PurchaseOrderNumber, 
       VendorID = x.VendorID, 
       ContractNumber = x.ContractNumber, 
       BuyerUserID = x.BuyerUserID 
      }); 
} 

각 블록 이후에, po는 다음 탐색 파라미터로 전달된다. 그러나, 당신이 짐작할 수 있듯이, 내 프로그램은 내가 중반의 Select 문에서 복잡한 유형을 만들 수 없다는 불평을한다. 또한 PurchaseOrder 객체를 mid의 내용으로 작성하여 새로운 PurchaseOrders 목록에 삽입하고 해당 목록을 쿼리 가능으로 변환하여 po에 할당하여 다음 블록으로 전달했습니다. 그러나 po의 데이터 형식이 System.Data.Object.ObjectSet에서 System.Collections.Generic.List로 변경되고 다음에 시도 할 때 InvalidOperationException이 throw되고 foreach를 사용하여 반복됩니다.

내 질문에 내 접근 방식에 명백한 실수가 있습니까? 아니면 문제에 접근하는 다른 방법에 대한 제안이 있습니까? 어떤 도움을 주셔서 대단히 감사합니다.

+0

: 경우에 당신의 PurchaseOrder 클래스는 정말 PurchaseOrderComments의 탐색 모음 (조인 사용하도록 강제하는)에 다음과 같은 작업을해야하고 당신의 이중 투사로 간단하지 않습니다 지원되지 않습니다. –

답변

2

나는 이것이 당신이 필요로하는 것보다 더 복잡하게 만들고 있다고 생각합니다. 난 당신이 뭘 하려는지 이해한다면, 당신은 같은 것을 할 수 있어야한다 :

if (!String.IsNullOrEmpty(searchViewModel.Comment)){ 
    po = po.Where(
    o => o.PurchaseOrderComments.Any(
     c => c.CommentText.Contains(searchViewModel.Comment))); 
} 
+0

나는 분명히 그 트릭을했다. 매우 감사합니다! – Jeff

1

StriplingWarrior의 솔루션이 가장 좋은 방법입니다. 이다 매핑 된 엔티티 유형에 투사

po=po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) => r);