2010-04-08 4 views
6

LINQ의 간단한 쿼리가 이상한 결과를 반환하는 이유를 알아 내려고하고 있습니다.LINQ 쿼리 첫 번째 결과의 여러 복사본 반환

데이터베이스에 정의 된보기가 있습니다. 기본적으로 몇 가지 다른 테이블을 결합하고 일부 데이터를 조작합니다. 대용량 데이터 세트를 다루고 약간 느릴 수 있다는 점을 제외하면 실제로 특별한 것은 없습니다.

오랫동안이 뷰를 쿼리하고 싶습니다. 아래의 두 가지 샘플 검색어는이보기와 다른 검색어를 보여줍니다.

var la = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).ToList(); 

var deDa = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).Select(p => new { p.AccountNumber, p.SecurityNumber, p.CUSIP }).ToList(); 

첫 번째 것은 목록을 반환해야합니다. 두 번째는 익명 객체 목록입니다.

엔티티 프레임 워크에서 이러한 쿼리를 수행 할 때 첫 번째 엔트리는 모두 똑같은 결과 목록을 돌려줍니다.

두 번째 쿼리는 계정 번호가 쿼리 한 값이고 다른 값은 다른 데이터를 돌려줍니다. 이것은 계좌 번호마다, 즉 하나의 계좌 번호 또는 다른 계좌 번호에 대한 쿼리를 수행하는 경우 하나의 계좌에 대한 모든 Position 객체가 동일한 금액 (해당 계좌에 대한 순위 목록의 첫 번째 계좌)과 두 번째 계정에는 모두 동일한 값을 가진 Position 객체 세트가 있습니다 (위치 객체의 첫 번째 목록에서도 마찬가지 임).

사실 두 개의 EF 쿼리 중 하나와 동일한 SQL을 쓸 수 있습니다. 그들은 모두 올바른 데이터를 보여주는 결과 (4 개)와 다른 증권 번호를 가진 하나의 계좌 번호를 반환합니다.

왜 이런 일이 발생합니까 ??? 거기에 첫 번째 쿼리의 네 가지 결과가있는 경우 첫 번째 레코드의 데이터도 2-4th의 개체에 나타납니다.

나는 이것을 일으킬 수있는 원인을 짐작할 수 없습니다. Google에서 모든 키워드를 검색했으며이 문제가있는 사용자를 보지 않았습니다. 우리는 추가 된 기능 (스마트 오브젝트)과 일부 스마트 속성을 위해 Positions 클래스를 부분 클래스로 분류합니다. 일부 뷰 모델 유형 지원을 제공하는 일부 생성자도 있습니다. 이 중 아무 것도 요청에서 호출되지 않습니다 (저는 99 % 확신합니다). 그러나 우리는 앱 전체에 동일한 패턴을 사용합니다.

내가 생각할 수있는 유일한 점은 EDMX에서 매핑이 느리다는 것입니다. EDMX의 "기본 키"가보기가 구성되는 방식에서 실제로 유일하지 않은 경우 이러한 상황이 발생할 수있는 방법이 있습니까? 이 모델을 EDMX로 가져온 개발자가 디자이너가 자동으로 선택할 항목을 선택하게했습니다.

어떤 도움을 받아야 할까?

+3

생성 된 SQL 스크립트를 가져 와서 Management Studio에서 대화 형으로 실행하여 실제 진행 상황을 확인하십시오. –

+0

profiler를 사용하여 수행중인 SQL을 살펴볼 수 있습니다. –

답변

13

를 상상할 수없는이 특정 문제에 대한 대답은 이것이다 :

있는지 확인 ENTITY 키가 고유! !! !!

EDMX에서 생성 된 뷰에는 엔티티 키로 표시되는 세 개의 열/속성이 있습니다 (레코드의 고유 ID 만들기 조합).

내 쿼리에서이 세 열은 모두 동일했습니다. 엔티티 프레임 워크가 정신을 잃어 버렸고 그 중 하나의 컬럼이 변경 될 때까지 (따라서 새로운 고유 한 "세트") 모든 후속 레코드에 첫 번째 레코드를 배치했다고 가정합니다.

이제는이 정보가 처음 사용 된 곳을 되돌아보고 그룹화 문이 먼저 적용된 것을 보았습니다 (데이터는 응용 프로그램의 다른 위치에서 저장 프로 시저를 통해 쿼리됩니다). 이 그룹은 엔티티 키 열 중 하나를 항상 고유하도록 평평하게했습니다. 이로 인해 해당 위치의 결과가 올바르게 표시됩니다.

내 솔루션은 SQL에서 NEWID()를 사용하여 GUID를 투영하는이보기에 새 열을 추가하는 것입니다. 문제는 내가 매핑 된 뷰의 유일한 엔터티 키로 새로 추가 된이 속성을 사용하도록 EDMX에 지시하는 방법을 모른다는 것입니다.

- 문제가 무엇인지 알고 새로운 질문에 내 다른 질문을하는 것처럼 수정했습니다. 대답 할 시간을 가진 사람들을위한 모든 통찰력에 감사드립니다!

+1

다른 질문에 연결 하시겠습니까? – defines

+0

plz보기 또는 edmx에서 PK로 설정 한 방법을 알려주십시오. –

+0

안녕하세요,이 코드베이스에 계속 액세스하고 싶습니다. 나는이 질문을 게시 한 후에이 위치를 그만 두었다. EF에서 이런 일을해야만하기 때문에 오래되었습니다. 유창한 API에서는 사소한 일입니다. 올바르게 호출 할 수있는 경우 모든 개별 키를 제거하여 매핑에서 합성 키를 만들지 않고 대신보기에서 PK로 생성 된 GUID를 사용했습니다. –

0

이 유형의 구문을 사용해 보셨습니까? ... 그것은 원인,하지만 누가 알

using (var dc = new OmsEntityContext()) 
{ 
    var la = (from p in dc.Position 
    where p.AccountNumber = "12345678" 
    select p).ToList(); 
} 

using (var dc = new OmsEntityContext()) 
{ 
    var deDa = (from p in dc.Position 
    where p.AccountNumber = "12345678" 
    select new {p.AccountNumber, p.SecurityNumber, p.CUSIP}).ToList(); 
} 

</longShot> 
관련 문제