2013-02-18 3 views
0

J'essaie de convertir une instruction SQL en LINQ et d'avoir quelques difficultés. Fondamentalement, j'essaie d'interroger un DataTable qui contient des données de navigation pour les produits (4 catégories de niveaux d'ID & descriptions, par exemple Men's> Jackets> Summer> Pullover). La catégorie de navigation devrait apparaître séquentiellement et ne pas avoir de "répétitions". Ce que je veux dire par là, c'est qu'une fois qu'une description se produit dans les lignes de données, cela peut se produire à nouveau, mais une fois qu'elle est passée à une autre description, elle ne peut plus revenir à cette description précédente. J'ai développé cette requête SQL dans Access et il semble faire ce que je besoin pour faire contre mes données de test:Requête LINQ/DataTable pour les répétitions

SELECT Count(Nav.Level1Text) AS CountOfLevel1Text, Nav.Level1ID, Nav.SO, Nav.DC, Nav.Language 
FROM Nav 
GROUP BY Nav.Level1ID, Nav.SO, Nav.DC, Nav.Language 
HAVING Count(Nav.Level1Text) > 1; 

Voici ce que j'ai obtenu jusqu'à présent:

var query = from table in navTable.AsEnumerable() 
      group table by new 
          { 
           Cat1Id = table["Cat1Id"], 
           Cat1Text = table["Cat1Desc"], 
           SalesOrg = table["SalesOrg"], 
           DistChan = table["DistChan"], 
           Language = table["Language"] 
          } 
      into groupedTable 
      where groupedTable.Key.Cat1Text.Count() > 1 //Count doesn't exist 
      select new {Cat1Count = groupedTable.Key.Cat1Text.Count(), groupedTable.Key.Cat1Id, groupedTable.Key.SalesOrg, 
      groupedTable.Key.DistChan, groupedTable.Key.Language}; 

Il semble que Je suis assez proche, mais j'ai des problèmes avec le morceau "où". Je ne peux pas comprendre comment obtenir le nombre de Level1Text (il n'y a pas de méthode Cat1Text.Count, mais je l'ai laissé pour montrer ce que je pense qu'il devrait faire). EDIT: J'ai donc réalisé que je ne l'avais pas expliqué très clairement, mais la requête détecte quand il y a un Cat1Id assigné à 2 Cat1Desc différents. C'est ce que je qualifie de "répétition". Par exemple, si un Cat1Id de '1' avec un Cat1Desc de 'Mens' se produit suivi d'un Cat1Id de '2' avec un Cat1Desc de 'Womens', cette requête devrait me le signaler car le 'Count (Cat1Desc)> 1' avec un ID différent.

+0

La partie difficile ici est qu'une table de base de données relationnelle n'a pas de notion de séquence, et encore moins de répétition. Il connaît cependant des doublons. Je pense que vous voulez détecter les doublons pour 'Nav.Level1Text' dans les cinq champs que vous regroupez. –

Répondre

1

Je compris la solution et je voulais poster pour que les autres puissent voir

var query = from table in navTable.AsEnumerable() 
      group table by new 
      { 
       Cat1Id = table["Cat1Id"], SalesOrg = table["SalesOrg"], 
       DistChan = table["DistChan"], Language = table["Language"] 
      } 
      into groupedTable 
      where groupedTable.Select(x => x["Cat1Desc"]).Distinct().Count() > 1 
      select new 
      { 
       Cat1Count = groupedTable.Select(x => x["Cat1Desc"]).Distinct().Count(), 
       groupedTable.Key.Cat1Id, groupedTable.Key.SalesOrg, 
       groupedTable.Key.DistChan, groupedTable.Key.Language 
      }; 

Il était important d'enlever « Cat1Desc » du groupe, puis utiliser le Distinct() dans le « où » et ' sélectionner'.

+0

Notez que vous pouvez utiliser 'let distinctCatDesc = groupedTable.Select (x => x [" Cat1Desc "]). Distinct(). Count()' juste avant le 'where' et ensuite l'utiliser dans' where' et le 'select' au lieu de le recalculer. – Servy

+0

Bon point. Merci! – CoolCriSyS

Questions connexes