문제

나는 MVC Storefront 코드를 통해 내 길을 진행하고 있으며 저장소, 서비스 및 DBML/데이터 컨텍스트 외부의 POCO 인 모델을 따르려고 노력하고 있습니다. 테스트를 작성하기 시작하고 이해하지 못하는 방식으로 실패 할 때까지 실제로 따라 가기가 매우 쉽습니다.

필자의 경우 기본 키는 int 필드 대신 고유 식별자입니다. 저장소는 iqueryable을 반환합니다.

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

이 경우 식당은 모델입니다. Restaurant는 물론 _context.restaurants.restaurant가 아닙니다.

모든 ()에 대한 서비스 클래스 (또는 리포지토리 단위 테스트)에서 필터링하면 예상대로 작동합니다.

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

이것은 잘 작동하고 하나의 모델이 있습니다. 이제 PKID와 같은 것을 시도하면 :

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

실패한 경우 :

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

사람들이 r => r.id이 [model.restaurants]이기 때문에 사람들이 말하는 일부 비슷한 게시물을 본다면 Linq2SQL 레이어는 알지 못하는 클래스 수준이기 때문입니다. 나에게 그것은 첫 번째 버전도 작동하지 않아야한다는 것을 의미합니다. 물론 내 PK가 int라면 잘 작동합니다.

여기서 실제로 무슨 일이 일어나고 있습니까? 주님은 하나의 일과 일을하지 않는 것이 직관적이지 않다는 것을 알고 있습니다. 나는 무엇을 오해하고 있습니까?

도움이 되었습니까?

해결책

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

따라서 비트를 다시 작성하십시오.

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

이것은 그것을 해결해야합니다.

다른 팁

실제로이 코드를 입력하지 않은 경우 시도해 보셨습니까?

var results = repository.all (). 여기서 (r => r.id.equals (새 GUID ( "088EC7F4-63E8-4E3A-902F-FC6240DF0A4B")). TOLIST ()

닌자

이것은 아마도 당신이 쿼리의 안내를 인스턴스화하려고한다는 사실과 관련이 있으며, LINQ에서 SQL에서 객체가 생성되기 전에 실제 SQL 코드로 변환하려고한다고 생각합니다.

쿼리가 아닌 쿼리 전에 인스턴스팅을 시도하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top