Linq to SQL은 TOP 또는 LIMIT / OFFSET에 해당합니까?


195

어떻게해야합니까

Select top 10 Foo from MyTable

Linq에서 SQL로?

답변:


146

VB에서 :

from m in MyTable
take 10
select m.Foo

이것은 MyTable이 IQueryable을 구현한다고 가정합니다. DataContext 또는 다른 공급자를 통해 액세스해야 할 수도 있습니다.

또한 Foo는 MyTable에서 속성 이름에 매핑되는 열이라고 가정합니다.

자세한 내용은 http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx 를 참조하십시오 .


127
C #에서는 작동하지 않으며 테이크 표현식이 없습니다. Take () 메서드를 사용해야합니다.
Adam Lassek

10
기술적으로 질문자는 Linq to SQL을 요청했기 때문에 VB는 실행 가능한 가정입니다. ALASSEK, 나는 AC # 남자 자신의 답변을 선호합니다. :-)
David Alpert 2016

3
글쎄, 당신은 C # LINQ로 작성된 예입니다. 그래서 내가 지적했습니다.
Adam Lassek

3
2 문제 : 1) VB에서 잘 작동합니다. C #에는 Take 메서드가 있습니다. 2) 테이크는 db가 아닌 클라이언트에서 작동하므로 큰 결과 집합이 있으면 db에서 클라이언트로 모든 결과를 가져옵니다!
Yuki

8
몇 년 전의 것이지만 여기에 오는 사람들에게는 ".Take (x)"가 ".Select ()"또는 ".ToList ()"를하기 전에 " .Take (x) "는 결과를 열거하기 전에 생성 된 SQL에만 포함됩니다. 이 후에 나타나는 경우 결과 집합이 열거되면 일반 Linq 문입니다.
Bertie

248

Take 방법을 사용하십시오 .

var foo = (from t in MyTable
           select t.Foo).Take(10);

VB에서 LINQ는 다음과 같은 표현을 가지고 있습니다.

Dim foo = From t in MyTable _
          Take 10 _
          Select t.Foo

설명서에서 :

Take<TSource>요소가 산출되거나 더 이상 요소를 포함하지 않을 source때까지 count요소를 열거 하고 산출 source합니다. 경우 count의 요소 수를 초과하는 source모든 요소의 source반환됩니다.


13
C #과 VB 간의 LINQ의 작은 차이는 성가신 일입니다. C #에 VB와 같은 테이크 표현식이없는 이유는 무엇입니까? 감독처럼 보입니다. 그리고 VB의 익명 Subs가 없기 때문에 람다는 훨씬 덜 유용합니다.
Adam Lassek

내가 찾던 바로 +1
Jasonco

1
+1 나도 필요한 것. 그리고 FWIW는 열 개의 레코드 만 실제로 파이프를 내려 오는 것으로 보입니다. 내 SELECT, 그렇지 않으면 반환 엄청난 던질 수있을만큼 양의 데이터 에서 OutOfMemoryException을 고통스러운 지연 후합니다. Take ( 관리 가능 수량 )를 사용하면 지연이 없으며 예외도 없습니다.
밥 카우프먼

VB에는 이제 Take () 메서드도 있습니다. 나는 복용량에 변수를 사용해야했고 그 방법은 효과가 없었지만 표현은 효과가 없었습니다.
Dave Johnson

33

Take(int n)방법을 사용하십시오 :

var q = query.Take(10);

25

OP는 실제로 예를 들어 오프셋을 언급했습니다. 30에서 60 사이의 항목을 가져 오려면 다음을 수행하십시오.

var foo = (From t In MyTable
       Select t.Foo).Skip(30).Take(30);

오프셋에는 "건너 뛰기"방법을 사용하십시오.
"Take"방법을 사용하여 제한하십시오.


13

@Janei : 내 첫 번째 의견은 샘플에 관한 것입니다.)

나는 당신이 이것을 좋아한다면, 당신은 4를 취하고 4에 정렬을하고 싶다고 생각합니다.

var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

idNews를 기준으로 전체 tbl_News를 정렬하고 4를 내림

var dados =  (from d in dc.tbl_News
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                }).Take(4);

아니 ? 결과가 다를 수 있습니다.


5

이것은 C #에서 잘 작동합니다.

var q = from m in MyTable.Take(10)
        select m.Foo

4

나는 이것을 좋아한다 :

 var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending

                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

7
이 접근법의 문제점은 내가 정말로 원하는 것이 상위 4 개 결과를 얻는 것이라고 생각할 때 4를 가져 와서 주문한다는 것입니다. 주문 후 테이크를 수행해야합니다 (Yanns 의견 참조).
Russell Troywest


3

테이크가 클라이언트에서 발생하는지 또는 db에서 발생하는지는 테이크 연산자를 적용하는 위치에 따라 다릅니다. 쿼리를 열거하기 전에 (즉, foreach에서 쿼리를 사용하거나 컬렉션으로 변환하기 전에) 적용하면 "top n"SQL 연산자가 db로 전송됩니다. SQL 프로파일 러를 실행하면이를 볼 수 있습니다. 쿼리를 열거 한 후 테이크를 적용하면 클라이언트에서 발생합니다. LINQ는 데이터베이스에서 데이터를 검색해야합니다.


2

정렬하지 않고 데이터베이스의 데이터를 가져 오는 것은 무작위 테이크와 동일합니다


결과가 반복 가능하다는 보장은 없지만, 특히 무작위 테스트는 아니지만 특히 테스트에서 많은 시간이 필요합니다.
Auspex

2
Array oList = ((from m in dc.Reviews
                           join n in dc.Users on m.authorID equals n.userID
                           orderby m.createdDate descending
                           where m.foodID == _id                      
                           select new
                           {
                               authorID = m.authorID,
                               createdDate = m.createdDate,
                               review = m.review1,
                               author = n.username,
                               profileImgUrl = n.profileImgUrl
                           }).Take(2)).ToArray();

0

Take (n) 메서드를 사용한 다음 목록으로 변환해야했습니다. 매력처럼 작동했습니다.

    var listTest = (from x in table1
                     join y in table2
                     on x.field1 equals y.field1
                     orderby x.id descending
                     select new tempList()
                     {
                         field1 = y.field1,
                         active = x.active
                     }).Take(10).ToList();

0

이런 식으로 그것은 나를 위해 일했다 :

var noticias = from n in db.Noticias.Take(6)
                       where n.Atv == 1
                       orderby n.DatHorLan descending
                       select n;

방금 귀하의 게시물을 편집했으며 포르투갈어 텍스트를 영어로 번역했습니다.이 사이트는 영어 전용이기 때문에 (변수 이름에는 적용되지 않으므로 변경하지 않았습니다).
waka

죄송합니다 ! 나는 브라질 스택 오버 플로우에 있다고 생각했다. 죄송합니다
Gladson Reis

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.