문제

다음과 같은 모습을 보이는 엔티티 프레임 워크와 함께 맵핑 된 LINQ 쿼리가 있습니다.

image = this.Context.ImageSet
                    .Where(n => n.ImageId == imageId)
                    .Where(n => n.Albums.IsPublic == true)
                    .Single();

이것은 단일 이미지 객체를 반환하고 의도 한대로 작동합니다.

그러나이 쿼리는 DB에서 내 이미지 테이블의 모든 속성을 반환합니다. 정상적인 상황에서는 괜찮을 것입니다. 그러나이 이미지에는 반품하는 데 시간이 오래 걸리는 많은 이진 데이터가 포함되어 있습니다.

기본적으로 현재 상태에서 LINQ 쿼리가 수행 중입니다.

Select ImageId, Name, Data
From Images
...

그러나이 명령을 수행하는 쿼리가 필요합니다.

Select ImageId, Name
From Images
...

데이터를 제외한 모든 것을로드하고 싶습니다. (이 데이터를 두 번째 비동기 패스로 얻을 수 있습니다)

도움이 되었습니까?

해결책

불행히도 LINQ에서 SQL을 사용하는 경우 최적의 솔루션이 없습니다.

3 가지 옵션이 있습니다.

  1. 컨텍스트 추적 및이 경우 이미지에서 모든 필드와 함께 엔티티를 반환합니다.
  2. 필드를 선택하고 익명 유형을 반환합니다
  3. 필드를 선택하고 강력하게 입력 한 사용자 정의 클래스를 반환하지만 원하는 경우 추적을 잃습니다.

나는 Linq에서 SQL을 좋아하지만 그게 그 방식입니다.

귀하를위한 유일한 솔루션은 데이터베이스를 재구성하고 모든 큰 데이터를 별도의 테이블로 옮기고 이미지 테이블에서 링크하는 것입니다.

이 방법으로 이미지를 반환 할 때 새로운 DataID 필드에서 키 만 리턴 한 다음 필요한 경우 더 무거운 데이터에 액세스 할 수 있습니다.

건배

다른 팁

이는 해당 필드 세트만으로 새 이미지를 만듭니다. 선택한 이미지에 대한 데이터를 얻기 위해 돌아 가면 기존 ID/이름 데이터와 병합하는 대신 전체 데이터 세트를 얻는 것이 좋습니다. ID/이름 필드는 아마도 데이터에 비해 작고 코드는 병합을 시도하는 것보다 훨씬 간단합니다. 또한 실제로 이미지 객체를 구성 할 필요는 없을 수 있습니다. 익명 유형을 사용하면 목적에도 적합 할 수 있습니다.

image = this.Context.ImageSet
                    .Where(n => n.ImageId == imageId)
                    .Where(n => n.Albums.IsPublic == true)
                    .Select( n => new Image { ImageId = n.ImageId, Name = n.Name }
                    .Single();

LINQ 2 SQL을 사용하는 경우] DBML 디자이너 내에서 개별 테이블 열을 지연시키는 옵션이 있습니다. 큰 바이너리 필드에 대해 이것을 true로 설정하십시오. 그런 다음 해당 데이터가 실제로 사용될 때까지로드되지 않습니다.

여러분 모두에게 질문 : 엔티티 프레임 워크가 MSVS 2010에서 지연된로드 Varbinary/Varchar 's를 지원하는지 아는 사람이 있습니까? ]

솔루션 #2 (엔티티 프레임 워크 또는 LINQ 2 SQL 용) :

기본 키와 Varchar (max)/varbinary (max) 만 포함하는 테이블의보기를 만듭니다. 그것을 ef에 매핑하십시오.

엔티티 프레임 워크 디자이너 내에서 테이블 정의에서 Varbinary (Max)/Varchar (Max) 속성을 삭제합니다 (보기에만 정의 됨). 이는 필드를 읽기/쓰기 작업에서 해당 테이블로 제외해야하지만 로거로 확인할 수 있습니다.

일반적으로 데이터 블로브를 제외하는 테이블을 통해 데이터에 액세스 할 수 있습니다. 얼룩이 필요하면보기에서 행을로드합니다. 당신이 당신이 견해에 쓸 수 있는지 확실하지 않습니다. 당신이 어떻게 글을 쓸지 잘 모르겠습니다. 보기에 쓸 수 있거나 저장된 절차를 작성해야하거나 한 테이블의 DBML 파일을 파열시킬 수 있습니다.

당신은 그것을 할 수 없습니다 LINQ 적어도 지금은...

내가 아는 가장 좋은 접근법은 창조하는 것입니다 View 테이블의 경우 큰 필드가 필요하지 않고 사용합니다. LINQ 그것으로 View.

또는 쿼리 표현식에서 새 새를 사용할 수 있습니다 ...

var image =
(
    from i in db.ImageSet
    where i.ImageId == imageId && i.Albums.IsPublic
    select new
    {
        ImageId = i.ImageId,
        Name = i.Name
    }
).Single()

LINQ 쿼리 표현식은 실제로 컴파일 타임에 Lambda 표현식으로 변환되지만 쿼리 표현식을 일반적으로 읽을 수 있고 이해하기 쉽기 때문에 프리 페어입니다.

감사 :)

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