2009-05-01 5 views
0

MVC Storefront 코드를 통해 작업하고 있으며 저장소, 서비스 및 poco 인 모델 (dbml/data 컨텍스트 외부)의 경로를 따르려고합니다. 테스트를 작성하기 시작하기 전까지는 실제로 이해하기 쉽지 않은 방식으로 실패했습니다.IQueryable, Where, Guid 및

필자의 경우 기본 키는 int 필드 대신 uniqueidentifier입니다.

이 경우
public IQueryable<Restaurant> All() 
{ 
    return from r in _context.Restaurants select new Restaurant(r.Id) 
     { 
      Name = r.Name 
     }; 
} 

, 레스토랑은 물론 Models.Restaurant이며, _context.Restaurants.Restaurant하지 : 저장소가 된 IQueryable을 반환합니다. ,

var results = Repository.All().Where(r => r.Name == "BW<3").ToList(); 

이 잘 작동 하나 Model.Restaurant 있습니다 모든 (대한 서비스 클래스 (또는 저장소 단위 테스트)에서

필터링)이 예상대로 작동합니다. 나는 pkid과 같은 일하려고하면 지금 : 사람들이 R => r.Id가 [모델이기 때문에이 말할 경우 일부 비슷한 게시물을 본 경우

The member 'BurningPlate.Models.Restaurant.Id' has no supported translation to SQL. 

:

var results = Repository.All().Where(r => r.Id == new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList(); 

을 실패합니다. 레스토랑]은 linq2sql 계층에서 인식하지 못하는 클래스 수준입니다. 나에게 그것은 첫 번째 버전이 작동하지 않아야 함을 의미합니다. 물론, 내 pk가 int 인 경우, 그것은 정상적으로 작동합니다.

실제로 무엇이 일어나고 있습니까? 주님은 하나의 일과 그렇지 않은 일이 매우 직관적이지는 않습니다. 내가 오해하니?

답변

0

여기 문제는 생성자 오버로드를 사용하고 쿼리를 채울 것으로 예상한다고 생각합니다. 이와 같은 프로젝션을 수행 할 때 프로젝션 쿼리에 포함될 모든 것을 넣어야합니다. 실제 투영 그 자체. 그렇지 않으면 Linq가 SQL 쿼리에이를 포함하지 않습니다.

그래서, 지금처럼 비트를 다시 작성 :

return from r in _context.Restaurants select new Restaurant() 
     { 
      Id=r.Id, 
      Name = r.Name 
     }; 

이 그것을 수정해야합니다.

+0

그리고 실제로 그것은 내 문제였습니다. 감사합니다 롭! – claco

0

실제로 입력 한 안 밖으로 코드, Repository.All() = 당신이

VAR 결과를 시도해야합니다. (R => r.Id.Equals (새 GUID ("088ec7f4-63e8-4e3a-902f -fc6240df0a4b ")). ToList()

닌자

+0

음, 그렇습니다. :-) 동일한 오류가있는 r => 같음 (r.Id, 새 Guid()) 및 같음 (r.Id, idvar) 버전을 시도했습니다. 나는 r => r.Id.Equals (idvar)를 시도하지 않았습니다. 나는 그 변화를 보았다고 말할 수 없다. – claco

+0

Repository.All(). Where (r => r.Id.Equals (id)). ToList(); 같은 오류가 발생했습니다. – claco

0

아마 당신은이 쿼리에서 GUID를 인스턴스화하기 위해 노력하고 있다는 사실과 관련이있다, 나는 SQL에 LINQ 실제 해당 변환을 시도하고 있다고 생각이 객체가 생성되기 전의 SQL 코드

q 쿼리와 관련이 없습니다.

+0

같은 오류가 발생했습니다. var id = new Guid ("088ec7f4-63e8-4e3a-902f-fc6240df0a4b"); var results = Repository.All(). 여기서 (r => r.Id == id) .ToList(); – claco