2009-05-20 3 views
3

나는 다소 구조 다음 (제거 불필요한 열)와 "티켓"테이블이Linq를 사용하여 데이터베이스 테이블의 고유 문자열 목록?

 
int | string | int | 
ID | Window | Count | 
------------------------ 
0 | Internet | 10 | 
1 | Phone | 20 | 
2 | Fax  | 15 | 
3 | Fax  | 10 | 
4 | Internet | 5  | 
. | .  | .  | 
. | .  | .  | 

그리고 클래스 "티켓"이 테이블을 매핑 한. 그래서 나는이 같은 모든 레코드를 얻을 수 있습니다 :

 
var tickets = from t in db.Tickets 
       select t; 

가 지금은 테이블의 고유 한 창 이름의 목록을 얻을 필요가있다. 위의 표를 들어, 목록과 같이 보일 것이다 :

  • 인터넷을
  • 전화
  • 팩스

모든 레코드를 가져 오는하고 반복하지 않고 목록을 만들 수 어쨌든 있나요?

SQL Server 2008 Express Edition을 사용하고 있습니다.

편집 : 답변 주셔서 감사합니다 위의 문제를 해결했습니다. 욕심이 많지만 거기에 어떤 방법이 있어도 각 창에 대한 총계를 얻을 수 있습니다. 예를 들어 :

  • 인터넷 = 15
  • 전화 = 25
  • 팩스 = 빌 와그너 20
+0

- 데이터베이스 그들에 걸쳐 뚜렷한를 적용하기 위해 전체 목록을 가져올 필요가있을 것이다. 아래의 해답은 정확합니다. 데이터베이스가 여전히 전체 테이블/인덱스를 스캔한다는 것을 알아 두십시오. – TheSoftwareJedi

+0

데이터베이스는 있지만, .NET 코드는 모든 레코드를 가져 와서 로컬에서 반복하지 않습니다. 이는 Hemant가 걱정하고있는 것입니다. –

답변

10

카운트를 얻으려면 다음을 그룹화해야합니다.

var tickets = from t in db.Tickets 
       group t by t.Window into grouped 
       select new { Window=grouped.Key, 
          Total=grouped.Sum(x => x.Count) }; 

foreach (var entry in tickets) 
{ 
    Console.WriteLine("{0}: {1}", entry.Window, entry.Total); 
} 

이 모든 것이 데이터베이스 측에서 수행되어야한다는 것을 알아 두십시오. SQL 쿼리를 검사하여이를 점검하십시오.

+0

두 번째 샘플은 t.Window 여야한다고 생각합니까? 나는 정말 초보자이므로 잘 모르겠습니다 ... – Hemant

+0

또한 업데이트 된 (추가 된) 질문에 답변 해 주시겠습니까? – Hemant

+0

Hemant : Doh, thanks, yes :) 후속 조치로 업데이트됩니다. –

1

Linq Samples Part 11 당신을 도움이 될 것입니다. 그냥 Linq 결과에 Distinct() 함수를 호출하십시오. 그것만큼이나 간단합니다. OCCURENCES, 힌트로 see this example의 숫자 Concering

var tickets = (from t in db.Tickets 
       select t).Distinct(); 

[EDIT]

.

var tickets = db.Tickets.Select(t => t.Window).Distinct(); 

내가 하나 이상의 작업을하고 있어요 때 만 사용 쿼리 식을 선호하지만, 당신이 그들을 좋아하는 경우에 해당은 다음과 같습니다 :

var tickets = (from t in db.Tickets 
       select t.Window).Distinct(); 

에 대해 어떻게

 int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 5 }; 

     var numberGroups = 
      from n in numbers 
      group n by 5 into g 
      select g; 

     g.Count(); // occurences 
+0

혼란 스럽습니다.이 코드는 어떤 분야에서 우리가 구별되고 있는지 어떻게 알 수 있습니까? – Hemant

+0

모든 필드의 조합이 구별되도록 * 고유 한 * 행의 목록을 리턴합니다. 이것은 SELECT DISTINCT 데이터베이스 메커니즘으로 변환됩니다. – tylerl

+0

결과 객체를 비교하고 있습니다. IEqualityComparer 인터페이스를 구현하여 사용자 지정 비교자를 제공하고 매개 변수로 comparer를 Distinct()에 전달할 수 있습니다. –

0

.Distinct() 연산자를 사용할 수 있습니다. 데이터베이스에 SELECT DISTINCT를 지정하여 사용자가 요구 한 것을 정확히 제공합니다.

1

쿼리는 저장소에서 평가됩니다.이상의 데이터베이스 측의 마법 (룩업 테이블 등, 트리거)없이

var windows = db.Tickets.Select(ticket => ticket.Window).Distinct(); 
3
var query2 = from ticket in db.tickets 

group window by ticket.Window into result 
select new 
{ 
    Name = result.Window, 
    Sum = result.Sum(i => i.Count) 
}; 
+1

"그룹 창"대신 "그룹 티켓"을 의미한다고 생각합니다. 또한 "결과"범위 변수에는 Window 속성이 없지만 Key 속성이 있습니다. –

+0

감사합니다. –

관련 문제