2016-07-12 12 views
0

저는이 문제에 대해 여러 번 돌아 왔고 몇 시간 동안 봤습니다. 지금도이 글을 쓰면서 위 제시된 중복은 도움이되지 않습니다.ODAC/Oracle Linq to Entities GroupBy FirstOrDefault와 동일합니다.

나는 다음과 같은 소프트웨어를 사용하고 있습니다 :

  • 닷넷 프레임 워크 4.5
  • 오라클 11.2.0.3.0을 (분명히)
  • 엔티티 프레임 워크 5.0
  • MVC 4
  • ODAC의 12C (충분한 정보인지 확실하지 않음)

ID 칼럼을 포함하고 있습니다 (그러나 이것은 유일하지 않습니다!), 다른 컬럼들, 그리고 "Order"컬럼 (숫자 2,0)을 포함하고 있습니다. ID별로 그룹화 된 '주문'열에서 가장 낮은 숫자로 모든 것을 선택하려고합니다.

query.GroupBy(item => item.Id).Select(item => item.Min(t => t.Order)); 

을하지만

내가 전체 엔티티가 필요합니다 (수 1 데는 보통 전체 목록을) 그냥 정수와 나에게는 IEnumerable을 제공합니다, 그래서 나는 이것을 시도 :

이 작동

query.GroupBy(item => item.Id).Select(item => item.OrderBy(t => t.Order).FirstOrDefault()); 

이 나에게 다음과 같은 예외 제공 :

"오라클 11.2.0.3.0이 N을 수행을 ot 지원 APPLY "

따라서 명백한 해결책은 위에 나열된 일부 내용을 업데이트하는 것입니다. 그러나 :이 아닌 입니다.

고유 키 (ID, 주문 및 StartDate 열, 예 ... 묻지 않음)를 선택할 수 있다고 생각했습니다. 그러나 나는 그것을 어떻게합니까?

이것은 분명히 잘못된 것입니다 :

query.GroupBy(item => item.Id).Select(item => new { item.Min(t => t.Order), item.Min(t => t.Id), item.Min(t => t.StartDate) }); 

내가 가장 낮은 주문 번호와 행에 속하는 값을 원하면서, 그들 모두의 최소 값을 선택하기 때문

. 그래서 이것이 첫 번째 질문이 될 것입니다. 어떻게 선택합니까?

두 번째 질문 : 고유 키와 함께 사용되는 엔티티 전체를 얻으려면 어떻게해야합니까? 하나의 선택에서 쿼리를 수행 할 수 있습니까? list.contains를 사용해야합니까?

제안 사항?

답변

2

단일 선택 문에서 쿼리 할 수없는 테이블 구조가있는 것 같습니다.당신은 두 가지 대안이 있습니다

  1. A는 중첩 된 선택
  2. 인 - 메모리 필터

해결 방법 1 (선택 중첩)

var intermediateResult = query 
    .GroupBy(item => item.Id) 
    .Select(item => new { item.Min(t => t.Order), item.Key }) 
    .ToArray(); 

이 당신의 배열을 (제공 Order, Id)를 사용할 수 있습니다.

용액 2 (메모리 필터)

var result = query 
    .GroupBy(item => item.Id) 
    .Select(item => item.OrderBy(t => t.Order)) 
    .ToArray() 
    .Select(item => item.First());</code></pre> 

이것은 메모리로 모든 레코드를로드하고, 행의 수에 따라서 선택하지 않을 생성 배열에 First()를 이용한다.

+0

나는이를 올바른 대답으로 받아 들였습니다. 이 대답에는 두 가지 추가 사항이 필요합니다. SelectMany를 사용하여 첫 번째 쿼리를 병합합니다 (이 예제보다 복잡합니다). 결과에서 고유 식별자 만 가져 와서 최종 데이터를 필터링합니다. 그 후 그것은 쉬웠다. –