2009-05-20 15 views
3

Ich habe einen „Tickets“ Tisch mit etwas folgenden Struktur (entfernt unnötigen Spalten)Liste der eindeutigen Zeichenfolgen in der Datenbanktabelle mit Linq?

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

Und ich habe diese Tabelle zu einer Klasse „Ticket“ abgebildet. So kann ich alle Datensätze wie folgt erhalten:

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

Jetzt muss ich die Liste der eindeutigen Fensternamen in der Tabelle erhalten. Für obige Tabelle würde Liste in etwa so aussehen:

  • Internet
  • Telefon
  • Fax

Gibt es trotzdem, um diese Liste zu erstellen, ohne alle Datensätze zu holen und Iterieren über sie?

Ich verwende Express Edition von SQL Server 2008.

EDIT: Danke für die Antworten Jungs es löste das obige Problem. Nur gierig sein, aber gibt es einen Weg zu auch bekommen die Gesamtzahl der Anzahl für jedes Fenster. Zum Beispiel:

  • Internet = 15
  • Phone = 25
  • Fax = 20
+0

Ohne weitere Datenbank Seite Magie (eine Lookup-Tabelle, Trigger usw.) - Die Datenbank muss die gesamte Liste, um holen, die deutlichen über sie anzuwenden. Die folgenden Antworten sind korrekt. Beachten Sie jedoch, dass die Datenbank weiterhin die gesamte Tabelle/den gesamten Index durchsucht. – TheSoftwareJedi

+0

Die Datenbank wird, aber der .NET-Code wird nicht alle Datensätze abrufen und lokal über sie iterieren, wofür Hemant sich Sorgen machte. –

Antwort

10

Wie wäre:

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

ich nur Ausdrücke verwenden Abfrage lieber, wenn ich mehr als eine Operation zu tun, aber wenn Sie sie mögen das Äquivalent ist:

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

Um die Anzahl zu erhalten, müssen Sie gruppieren:

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); 
} 

Beachten Sie, dass dies alles auf der Datenbankseite ausgeführt werden sollte - untersuchen Sie die SQL-Abfrage, um dies zu überprüfen.

+0

Ich denke, die zweite Probe sollte t.Window sein? Ich bin wirklich ein Anfänger, also nicht wirklich sicher ... – Hemant

+0

Auch bitte können Sie die aktualisierte (addierte) Frage beantworten? – Hemant

+0

Hemant: Doh, danke, ja :) Wird für das Follow-up aktualisiert. –

1

Linq Samples Part 11 von Bill Wagner soll Ihnen helfen. Rufen Sie einfach die Distinct() Funktion Ihres Linq-Ergebnisses auf. So einfach ist das.

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

[EDIT]

die Nummern der Vorkommen concering, see this example als Hinweis.

 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

Ich bin verwirrt, woher weiß dieser Code, in welchem ​​Bereich wir suchen? – Hemant

+0

Es gibt die Liste der * eindeutigen * Zeilen zurück, so dass die Kombination aller Felder eindeutig ist. Dies führt zu dem Datenbankmechanismus SELECT DISTINCT. – tylerl

+0

Es vergleicht die resultierenden Objekte. Sie können einen benutzerdefinierten Vergleicher bereitstellen, indem Sie die Schnittstelle IEqualityComparer implementieren und den Vergleich als Parameter an Distinct() übergeben. –

0

Sie können den .Distinct() -Operator verwenden - er wird eine SELECT DISTINCT zur Datenbank machen und genau das geben, wonach Sie fragen.

1

Die Abfrage wird im Geschäft ausgewertet.

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

Ich denke du meinst "Gruppenticket" statt "Gruppenfenster". Außerdem hat die Bereichsvariable "result" dann keine Window-Eigenschaft, aber eine Key-Eigenschaft. –

+0

In beiden Punkten korrigieren, danke. –

Verwandte Themen