2016-07-21 18 views
0

Ich brauche eine Abfrage, die mir hilft, dies zu lösen.Gruppieren nach Abfrage, jede Gruppe muss keinen Eintrag haben, der nicht in einer Liste enthalten ist

Hier ist meine Tabelle 'Tags':

  • id (int)
  • Name (String)
  • user_id (int)
  • hardware_id (int)

Ich bin Gruppierung der Ergebnisse der Tabelle "Tags" nach Hardware-ID. Ich habe auch eine Liste von Tags (List<string>).

Ich möchte die Hardware-ID der Gruppen erhalten, die alle Tags in der benutzerdefinierten Liste in der obigen Tabelle bei name übereinstimmen.

Mit anderen Worten, ich möchte die Hardware-IDs erhalten, dass die benutzerdefinierten List-Tags ihre name entspricht. Möglicherweise gibt es name, die keine Übereinstimmung in der benutzerdefinierten Liste hat, aber alle benutzerdefinierten List-Tags müssen in der Gruppe sein, und wenn es diese Anforderung erfüllt, kann ich die ID dieser Gruppe.

Ich fand es schwer zu erklären und ich bekam keine Antwort dafür. Ich dachte daran, es mit foreach zu machen, weil es so schwer zu lösen war, aber ich konnte es auch nicht und es ist sehr ineffizient, es so zu machen.

Beispiel:

Liste: [ 'tag1', 'tag2']

Tabellenzeilen:

1, tag1, 5, 1 
2, tag2, 5, 1 
3, tag3, 5, 1 
4, tag4, 5, 2 
5, tag5, 6, 2 

In diesem Fall sollte ich die hardware_id von 1 bekommen, denn obwohl ein der Hardware-IDs haben tag3, es hat keine Zeilen mit einem Tag-Namen, der nicht in der Liste ist. WENN die Liste "tag4" hätte, würde die hardware_id = 1 NICHT zurückgegeben werden, da die Liste ein Tag hat, das die Gruppe hardware_id nicht hat.

Wenn die Gruppe über kein Element verfügt, das die Liste enthält, wird es nicht im Endergebnis angezeigt.

mir jemand diesen Code Spiel, aber es hat nicht funktioniert:

List<decimal> matchingHardareIds = db.tags.GroupBy(x => x.hardware_id) 
     .Where(x => x.All(s => tags.Contains(s.name.ToLower()) || 0 == tags.Count() && (s.user_id == userId))) 
     .Select(x => x.Key).ToList(); 

In dieser Abfrage, wenn ich einen Tag in der Liste haben und in der Tabelle Ich habe mehrere Artikel mit hardware_id 1 und einem der Sie haben einen 'name', der gleich dem Wert in der Liste ist. Es werden leere Ergebnisse zurückgegeben. Dies liegt daran, dass die Zeilen in der Tabelle für eine bestimmte Gruppe nach Hardware-ID eine Zeile mit einem Namen enthalten, der nicht in der benutzerdefinierten Liste angezeigt wird.

Ich brauche eine Abfrage in Entity Framework oder Linq. Danke vielmals.

Antwort

1

verwenden:

var t = db.tags.GroupBy(x => x.hardware_Id) 
      .Where(x => tags.All(y => 
          x.Any(z=> z.name == y))) 
      .Select(x=>x.Key).ToList(); 
+0

Wenn dies funktioniert, gebe ich Ihnen alle meine Stackoverflow-Punkte –

+0

Für das Beispiel, das Sie angegeben haben, habe ich es getestet, und es hat funktioniert. –

+0

Ich liebe dich! dies ist ein coder kuss <<<> >> Danke !! –

1

Sie können nicht mit dem Entity Framework oder Linq-Abfrage zur Verfügung stellen, aber die SQL-Lösung ist, die Spiele wie diese zu zählen:

SELECT hardware_id 
FROM tags 
WHERE name IN (<list>) 
GROUP BY hardware_id 
HAVING COUNT(DISTINCT name) = <listDistinctCount> 

<listDistinctCount> die Anzahl der unterschiedlichen Werte in der Liste ist. Was können Sie vor der Abfrage vorbereiten?

+0

Es keine doppelten Namen für die gleiche hardware_id –

+0

sein kann dann nur Sie brauchen nicht die DISTINCT Teil –

+0

Sie erhalten von denen gelesen, die nicht zuerst passen. Diejenigen, die noch übrig sind, müssen die gleiche Anzahl von Zeilen haben wie die Liste. Wie zum Teufel werde ich es in Linq übersetzen ... LOL ... Ich brauche einen Moment. –