2009-11-23 4 views
1

나는이SQL Server 검색, 전체 행 수를 반환하는 방법?

SELECT DISTINCT 
     a.ArticleID, 
     COUNT(*) AS KeywordMatch, 
     a.Headline, 
     a.ShortDescription, 
     a.CategoryID, 
     a.ArticleSectionImage, 
     a.DatePublished 
    FROM 
     Article a 
    JOIN SearchWords sw ON a.ArticleID = sw.ArticleID 
    WHERE 
     EXISTS 
     (
      SELECT 
       1 
      FROM 
       iter_charlist_to_tbl(@temp, ' ') s 
      WHERE 
       s.nstr = sw.SearchWord 
     ) 
     AND 
      a.ArticleState = 3 
    GROUP BY 
     a.ArticleID, a.Headline, a.ShortDescription, a.CategoryID, a.ArticleSectionImage, a.DatePublished 
    ORDER BY (KeywordMatch) DESC, (a.DatePublished) DESC 

겼고, post 나는 누구나 페이징을 만들 수 Linq에 - 투 - SQL과 함께이 사용하고 있습니다. 문제는, 내가 얼마나 많은 레코드 내 검색 반환 (총 행), 사용자에 대한 올바른 화살표를 표시 알아야합니다.

이 내 Linq에 - 투 - SQL 쿼리는 다음과 같습니다

int iPageNum = pageNumber; 
    int iPageSize = (int)pageSize; 

    results = data.SearchArticles(searchString).Skip((iPageNum - 1) * iPageSize).Take(iPageSize).ToList(); 

어떤 아이디어?

Linq-to-SQL이 데이터베이스의 모든 레코드를 가져오고 있습니까? 아니면 내가 필요한 레코드만을 선택하는 쿼리를 생성합니까? 어떻게 쿼리를 수행 할 수 있습니까? 당신이 data.SearchArticles의 부분 어쨌든 전체 세트를 가져 오는되기 때문에

+0

어떤 유형의 고객을 쓰고 계십니까? 이미 사용할 수있는 페이징 구성 요소가 이미 있음을 알 수 있습니다. –

+0

새로운 "신문"사이트에 검색 기능을 추가했습니다. 그래서 나는 모든 것을 스스로하고있다. – Patrick

답변

2

한 가지 방법은 두 개의 쿼리, 즉 하나는 카운트를 반환하고 다른 하나는 데이터를 반환하는 것입니다.

여분의 DB 왕복을 피하기 위해 여러 결과 세트가있는 하나의 SP에 둘 다를 넣을 수 있습니다. 저의 책에서 데이터 페이징 예제 (카운트 제공 포함)에 대해 자세히 설명합니다 : Ultra-Fast ASP.NET. 내 접근 방식은 여러 결과 집합을 지원하지 않기 때문에 LINQ를 사용하지 않지만 더 빠릅니다. 여기

는 결과의 행 수를 계산해야 쿼리 (안 테스트,하지만 가까이 있어야) :

SQL 서버 :

;WITH SearchArticles (aid, cnt, headline, descr, cid, img, datepub) as ( 
SELECT DISTINCT 
      a.ArticleID, 
      COUNT(*) AS KeywordMatch, 
      a.Headline, 
      a.ShortDescription, 
      a.CategoryID, 
      a.ArticleSectionImage, 
      a.DatePublished 
     FROM 
      Article a 
     JOIN SearchWords sw ON a.ArticleID = sw.ArticleID 
     WHERE 
      EXISTS 
      (
        SELECT 
         1 
        FROM 
         iter_charlist_to_tbl(@temp, ' ') s 
        WHERE 
         s.nstr = sw.SearchWord 
      ) 
      AND 
        a.ArticleState = 3  
     GROUP BY 
      a.ArticleID, a.Headline, a.ShortDescription, a.CategoryID, 
      a.ArticleSectionImage, a.DatePublished 
) SELECT COUNT(*) FROM SearchArticles 
+0

잘 Linq에서 변수를 OUTPUT으로 설정하고 개수를 할당 할 수 없습니다. 그 변수에? 문제점은 행 수를 반환하기 위해 해당 쿼리를 재구성하려고했습니다. – Patrick

+0

그런 식으로 계산하는 행을 모두 반환하는 경우에만 작동합니다. 당신이 원하는 것은 총 행 수를 계산하는 것인데, 표시 할 부분 집합 만 반환하는 것 같습니다. 권리? 전체 카운트를 얻으려면 카운트 (*) 만 반환하도록 쿼리를 변경하고 group by 및 order by 절을 제거 할 수 있어야합니다. – RickNZ

+0

글쎄,하지만 그 대신에 행의 개수와 일치하는 키워드의 수를 반환합니다. – Patrick

1

왜 이렇게하지 :

var results = data.SearchArticles(searchString); 
var count = results.Count(); 

results = results.Skip((iPageNum - 1) * iPageSize).Take(iPageSize).ToList(); 

이 확인 여부에 관해서는 반환 결과의 크기에 많이 의존한다.

+0

일반적인 생각은 전체 결과 집합을 가져 오는 것을 피하는 것이 었습니다 ... 왜 전체 레코드 집합을 반환합니까? 이 문을 통해 생성 된 SQL 쿼리를 볼 수있는 방법을 찾으려고합니다. 모든 것이 풀리면 많은 행이 반환됩니다. – Patrick

+0

글쎄, 내가 그랬다면, 그때 나는 그 결과를 한 번 더 열거하고 오류 메시지를 얻을 것이다. – Patrick

+0

전체 집합을 꺼내지 않으려면 페이징 집합과 총 개수를 모두 반환하는 저장 프로 시저를 권합니다. 이 기사를 참조하십시오 : http://www.beansoftware.com/ASP.NET-Tutorials/Paging-Stored-Procedures.aspx – Richard

1

다른 답변에 귀하의 의견을 읽은 후 페이징에 내장되어 있지 않습니다. 따라서 기본적으로 쿼리는 모든 행을 가져옵니다. 쿼리가 모든 행을 가져 오지 않으면 ResultSet 객체가 사용자를 위해 페이징을 수행합니다. 결과 집합이 페이징이 아닌 경우 Count() 속성을 확인하기 위해 모든 결과를 반복 할 필요가 없으며 SQL Server가 데이터와 함께 행 수를 반환하므로 올바르게 설정해야합니다.

한 번에 너무 많은 데이터를 가져 오는 것에 대해 걱정할 필요가있는 경우 결과 세트가 페이지로 표시되지 않으면 계산을 먼저 선택한 다음 원하는 데이터 페이지를 반환 할 수있는 쿼리를 작성해야합니다.

옆으로 : 당신의 선택을 뚜렷하게 남겨 둘 수 있습니다. 집계하고 그룹화하면 서로 다른 결과가 이미 보장됩니다.

관련 문제