2012-04-09 3 views
0

내가 쓴이 방법이 있습니다 Linq에 비 원시 형에게 쿼리

private void GetReceivedInvoiceTasks(User user, List<Task> tasks) 
     { 
      var taskList = from i in _db.Invoices 
          join a in user.Areas on i.AreaId equals a.AreaId 
          where i.Status == InvoiceStatuses.Received 
          select i; 

     } 

은 기본적으로 내가받은 상태가 사용자의 영역에서 데이터베이스의 모든 송장을 얻으려고 노력했습니다. 나는 지금 linq을 이해하지 못한다. 같은 INT32, 문자열, 그리고

기본 {System.SystemException} = { "유형 'Models.Area을'의 상수 값을 만들 수 없습니다 만 기본 유형 ('.

나는 오류를 받고 있어요 Guid ')이이 문맥에서 지원됩니다. "}

누군가 내가 잘못하고있는 것을 설명하고이를 어떻게 해결할 수 있습니까? 나는 현재 문제가 무엇인지 이해할 수 없다. 조인 라인을 꺼내면 괜찮지 만 사용자 영역/지역 (둘 이상의 영역에 속할 수 있음)의 송장 만 있는지 확인하려면 해당 라인이 정말로 필요합니다. 이 쿼리에 근본적으로 잘못된 점이 있습니까?

답변

4

Entity Framework는 메모리 내 컬렉션과의 조인을 지원하지 않습니다. Contains 쿼리를 원시 집합으로 대신 사용하려면 쿼리를 다시 연결해야합니다.

또한 EF는 현재 enum 값을 지원하지 않으므로 정수 값 (InvoiceStatuses.Received이이 부분을 무시하는 enum 값이 아닌 경우)과 비교해야합니다. 에 해당하는 결과를 초래한다 다음 쿼리 접근 방식에 리드를 결합

모두 수정하여 가입 :

int statusReceived = (int)InvoiceStatuses.Received; 
var areaIds = user.Areas.Select(x=> x.AreaId).ToArray(); 

var taskList = from i in _db.Invoices 
       where i.Status == statusReceived && areaIds.Contains(i.AreaId) 
       select i;