2013-01-09 2 views
5

사용자 지정 모델에 대해 하나의 LINQ 쿼리가 있습니다. 방금 모델 속성에 값을 할당하는 메서드를 사용하려고했습니다. 나는 사용자 정의 모델을 사용하려고하면 그러나이 같은 일부 오류 메시지가 발생합니다 :LINQ 내부 메서드 호출

방법 '선택 System.String GetPONo (엔트, 선택 System.String)'방법을 인식하지 못하는 엔티티 및이 방법에 LINQ는 할 수 없습니다 상점 표현으로 번역 될 수 있습니다.

코드

var model = (from p in db.PoDetails 
      select new porders 
      { 
       Category = p.Category, 
       PONO = GetPONo(p, p.Category), 
       }).ToList(); 

방법

public string GetPONo(PoDetail p, string ASD) 
{ 
    if (ASD == "B") 
    { 
     var PoNo = (from pord in db.Porders where pord.Id == p.PoId select pord.No).FirstOrDefault(); 
     return PoNo; 
    } 
    else 
    { 
     var PoNo = (from porder in db.Porders 
        where porder.Id == (from rec in db.RecommendResources where rec.Id == p.BibId select rec.PoId).FirstOrDefault() 
        select porder.No).FirstOrDefault(); 
     return PoNo; 
    } 
} 

답변

1
당신은 PONO 카테고리 값에 따라 서로 다른 하위 쿼리를 수행하는 삼항 연산자를 사용할 수 있습니다

var model = (from p in db.PoDetails 
      select new porders 
      { 
       Category = p.Category, 
       PONO = p.Category == "B" ? 
         (from pord in db.Porders 
         where pord.Id == p.PoId 
         select pord.No).FirstOrDefault() : 
         (from porder in db.Porders 
         where porder.Id == (from rec in db.RecommendResources 
              where rec.Id == p.BibId 
              select rec.PoId).FirstOrDefault() 
         select porder.No).FirstOrDefault() 
      }).ToList(); 

또한 저장 프로 시저를 만들 수 있습니다.

+1

덕분에 내 대답은 좀 걸릴 수 있습니다. 잘 작동합니다. – Dheyv

6

LINQ to Entities가 백그라운드에서 SQL로 변환되기 때문입니다. 물론 GetPONo(p, p.Category) 메서드가 SQL에 없으므로 코드가 실패합니다. ToList()을 호출하여 select 전에 쿼리를 실행하도록하면이 문제를 해결할 수 있습니다.

var model = (from p in db.PoDetails select p).ToList(); 
model = from m in model 
     select new porders 
     { 
      Category = m.Category, 
      PONO = GetPONo(m, m.Category) 
     }; 

당신은 비슷한 질문 here