2012-01-05 2 views
0

Linq to Entities 쿼리를 수행하면 "Data.InhouseUnit 형식의 상수 값을 만들 수 없습니다."와 같은 기본 형식 ('Int32, String 및 Guid')이이 컨텍스트에서 지원됩니다 "예외입니다.엔터티 프레임 워크 쿼리에 Linq에서 if-else 절

IList<FaultReport> faultReports = (from fr in _session.FaultReports 
    where fr.CreatedOn > dateTime 
    select new FaultReport 
    { 
     Id = fr.Id, 
     ExecutionDate = fr.ExecutionDate ?? DateTime.MinValue, 
     FaultType = fr.FaultType, 
     Quarters = fr.Quarters, 
     InhouseSpaceId = fr.InhouseSpaceId, 
     InhouseSpace = new InhouseSpace { Id = fr.InhouseSpace.Id, Name = fr.InhouseSpace.Name }, 
     InhouseUnitId = fr.InhouseUnitId ?? Guid.Empty, 
     **InhouseUnit = fr.InhouseUnitId == Guid.Empty ? null : new InhouseUnit { Id = fr.InhouseUnit.Id, Name = fr.InhouseUnit.Name }** 
}).ToList(); 

특히 굵은 체로 표시되는 if 식은 예외입니다. 나는 fr.InhouseUnitId가 nullable이기 때문에 수표를 발행해야합니다. 내가 과감한 표정을 지우면 성명서의 나머지는 잘됩니다. 예외의 원인을 이해하기 위해 msdn 포럼과 웹에서 상당한 시간을 보냈지 만 여전히 이해할 수는 없습니다. Guid는 스칼라이므로 제대로 작동해야합니다. 위의 문장에서 굵게 표시된 표현 대신이 표현 인 InhouseUnit = true ? null: new InhouseUnit()도 작동하지 않습니다./

내가 논리를 빼앗아 단지 결과를 반환하는 확장 메서드를 작성하려고하면

다른, 다음과 같은 예외가 발생하면 우리는 심지어 쓸 수 :

LINQ to Entities does not recognize the method 'System.Object 
GuidConversion(System.Nullable`1[System.Guid], System.Object)' method, and this method 
cannot be translated into a store expression 
+1

내가 잘못 아니에요, 여기에 문제는 아무 생각 fr.InhouseUnitId의 어떤 가치가없는 것처럼 컴파일러, SQL 쿼리로 LINQ를 컴파일 할 수없는 것입니다 - Guid.Empty 그 당시있을 것입니다. LINQ 문은 SQL 문으로 컴파일하려면 일정해야합니다. 나는이 문제에 대한 해결책을 모르기 때문에이를 설명으로 남겼습니다. –

+0

@DarylTeo, 컴파일이 정상적으로 실행되면 예외가 throw됩니다. 처음에는 fr.InhouseUnitId가 nullable이므로 fr.InhouseUnitId == null이었습니다. LINQtoSQL에서 이전에 그런 식을 사용해 보았습니다. 아마 뭔가 이상한 일을하는 엔티티 프레임 워크입니다. – Xience

답변

0

그것은 당신이 새로운으로 돌출되어 보이는 사용자가 조회하는 것과 동일한 유형의 오브젝트. 그럴까요? 약간 이상하게 보일지 모르지만 이것을 수행 할 좋은 이유가 있다고 가정하면 쿼리를 두 부분으로 나눌 수 있습니다. 첫 번째 부분은 데이터베이스에서 필요한 것을 얻을 수 있습니다. 두 번째 부분은 로컬로 (즉, LINQ에서 객체로) 실행되어 필요한 프로젝션을 제공합니다. 이런 식으로 뭔가가 :

var query = 
    from fr in _session.FaultReports 
    where fr.CreatedOn > dateTime 
    select new { 
    fr.Id, 
    fr.ExecutionDate, 
    fr.FaultType, 
    fr.Quarters, 
    InhouseSpaceId = fr.InhouseSpace.Id, 
    InhouseSpaceName = fr.InhouseSpace.Name, 
    InhouseUnitId = fr.InhouseUnit.Id, 
    InhouseUnitName = fr.InhouseUnit.Name, 
    }; 

IList<FaultReport> faultReports = (
    from fr in query.ToList() 
    select new FaultReport { 
    Id = fr.Id, 
    ExecutionDate = fr.ExecutionDate ?? DateTime.MinValue, 
    FaultType = fr.FaultType, 
    Quarters = fr.Quarters, 
    InhouseSpaceId = fr.InhouseSpaceId, 
    InhouseSpace = new InhouseSpace { Id = fr.InhouseSpaceId, Name = fr.InhouseSpaceName }, 
    InhouseUnitId = fr.InhouseUnitId ?? Guid.Empty, 
    InhouseUnit = fr.InhouseUnitId == Guid.Empty ? null : new InhouseUnit { Id = fr.InhouseUnitId, Name = fr.InhouseUnitName } 
    }).ToList();