2009-08-11 2 views
1

새로운 LINQ 공급자를 사용하는 LINQ 쿼리를 사용하는 다중 필드 검색 페이지에서 사용하는 기준 쿼리를 대체하려고합니다. 그러나 페이징을 구현할 수 있도록 레코드 수를 늘리는 데 문제가 있습니다. 나는 그 결과를 달성하려고 노력하고있다 LINQ를 사용하여 기준 API에서 CountDistinct 투영에 의해 생산 된 것과 동일합니다. 이것을 할 수있는 방법이 있습니까?NHibernate - LINQ를 사용하는 CountDistinct 투영과 같습니다.

LINQ에서 제공하는 Distinct() 메서드는 예상대로 동작하지 않고 "Diffinct(). Count()"를 LINQ 쿼리 끝에 추가합니다. 고유 카운트 (정수 ID 열)는 해당 값의 뚜렷하지 않은 수를 반환하는 것으로 보입니다.

필요한 경우 사용하는 코드를 제공 할 수 있지만 너무 많은 입력란이 있기 때문에 꽤 길어서 필요하지 않은 경우 게시물을 군중에 넣고 싶지 않습니다.

감사합니다.

답변

2

모든 상황에서 최적이 아닐지라도이 방법을 알아 냈습니다. .Count()없이 사용할 경우 LINQ 쿼리에서 .Distinct()를 수행하면 실제로 결과 SQL 쿼리에서 "고유 한"구문이 생성됩니다. .Distinct(). ToList()를 사용하여 쿼리를 열거하고 결과 인 메모리 컬렉션에서 .Count() 메서드를 사용하면 원하는 결과를 얻습니다.

이것은 실제로 응용 프로그램 코드에서 계산이 수행되고 DB에서 응용 프로그램으로 전체 ID 목록을 보내야하기 때문에 기준 쿼리로 원래 수행했던 것과 정확히 동일하지 않습니다. 필자의 경우, 고유 ID의 수가 적 으면 좋겠지 만 성능 병목 현상은별로 없을 것입니다.

그러나 진정한 CountDistinct() LINQ 연산이 향후 구현 될 수 있기를 바랍니다.

+0

방금 ​​같은 문제가 발생했습니다. 이것은 저에게 LINQ 어댑터가 잘못된 SQL을 생성하는 문제와 같습니다. 나는'Count()'를하기 전에'ToList()'로 질의의 평가를 강요하면서 같은 해결 방법을 사용해야했다. –

0

뚜렷한 수를 원하는 열을 선택할 수 있습니다. 그것은 다음과 같습니다 : Select (p => p.id) .Distinct(). Count(). 그것이 그대로, 당신은 객체 전체를 구별하고 있습니다. 이것은 객체의 참조가 아닌 실제 값을 비교할 것입니다.

+0

좋은 아이디어와 내가 시도한 것. 불행히도, 그것은 내가 기대했던대로 작동하지 않는 것 같습니다. 내 상황에서는 실제로 27 개의 고유 한 ID가 있지만 47,000과 같은 값을 반환하는 모든 조인으로이 작업을 수행합니다. .Distinct(). Count()를 수행하는 쿼리는 실제로 "고유"하지 않습니다. 다행히 향후 버전에서 변경 될 수있는 무언가. –

관련 문제