2017-10-20 3 views
1

L'objectif principal est de migrer les données appropriées d'une table à une autre, et comme mes compétences ne sont pas nettes dans sql, j'ai écrit la logique en utilisant linq et foreach pour accomplir ce qui est nécessaire. Cependant, un script sql est nécessaire pour fonctionner dans un environnement différent, j'ai donc commencé à traduire ce que j'ai précédemment écrit en sql, et mon processus de réflexion sql a été brisé au niveau de GroupBy et de bouclage des rives.Traduction du bloc de code Linq en SQL

Voici ma tentative qui, en fait, renvoie une des données précises résultat:

SELECT BookID FROM (SELECT bt.BookID, pt.PaperID, ppt.PropID 
FROM BooksTable AS bt 
JOIN PapersTable AS pt 
ON bt.BookID = pt.BookID 
JOIN PapersPropertiesTable AS ppt 
ON pt.PaperID = ppt.PaperID) AS ResultSet 
GROUP BY BookID 

Voici le code où je frappe un rocher:

foreach (var i in ResultSetGroupedByBookID) 
{ 
    var resultToMigrate= i.DistinctBy(j => j.PropID).ToList(); 

    foreach (var j in resultToMigrate) 
    { 
     db.InsertPropsProcedure(j.BookID, j.PropID); 
    } 
} 

Les principaux défis :

  • GroupingBy qui renvoie un résultat interne ensemble avec d'autres colonnes incluses
  • Boucle à travers le jeu de résultats intérieure, DistinctBy PropID et retourner un autre ensemble
  • Boucle dans le nouvel ensemble, appeler la procédure d'insertion et de transmettre les params

Mise à jour:

J'ai choisi la réponse de Stepen pour son simplicty; Cependant, je suis tombé sur le scénario où je devais Distinct plusieurs colonnes en retournant un troisième, donc je devais faire la modifications suivante:

INSERT INTO Table2(BookID, PropID, PropValue) 
SELECT DISTINCT bt.BookID, ppt.PropID, MAX(ppt.PropValue) AS PropValue 
FROM BooksTable AS bt 
JOIN PapersTable AS pt ON bt.BookID = pt.BookID 
JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID 
GROUP BY bt.BookID, ppt.PropertyID 
ORDER BY bt.BookID 

Répondre

1

Je ne comprends pas ce que vous essayez de faire exactement, mais votre requête SQL peut être écrit comme suit:

SELECT DISTINCT bt.BookID 
    FROM BooksTable AS bt 
    JOIN PapersTable AS pt ON bt.BookID = pt.BookID 
    JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID; 
  • Pas besoin de la requête interne.
  • Pas besoin de groupe par. Utilisez DISTINCT.

Vous mihgt devez utiliser INSERT INTO SELECT pour insérer le résultat de cette requête dans une autre table:

INSERT INTO Table2(BookID,PropID) 
    SELECT DISTINCT bt.BookID, ppt.PropID 
    FROM BooksTable AS bt 
    JOIN PapersTable AS pt ON bt.BookID = pt.BookID 
    JOIN PapersPropertiesTable AS ppt ON pt.PaperID = ppt.PaperID 
2

Si vous connaissez le SQL & veulent traduire en LINQ ou si vous connaissez LINQ & veulent de traduire à SQL

meilleur outil est LinqPad

1

la lecture de votre question et le code et En déduisant un peu du code, je crois comprendre que vous voulez récupérer une liste de BookId avec les propriétés de papier associées et ensuite exécuter une procédure stockée pour chacun. Une façon d'accomplir cela avec une approche SQL uniquement plutôt que d'avoir C# orchestrer les appels serait d'utiliser un curseur à la place du résultat de la requête LINQ.Voici un exemple:

DECLARE migrate_cursor CURSOR 
FOR 
SELECT DISTINCT bt.BookID, ppt.PropID 
FROM BooksTable AS bt 
    INNER JOIN PapersTable AS pt 
    ON bt.BookID = pt.BookID 
    INNER JOIN PapersPropertiesTable AS ppt 
    ON pt.PaperID = ppt.PaperID; 

OPEN migrate_cursor; 

FETCH NEXT FROM migrate_cursor 
INTO @bookId, @propId; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXECUTE my_insert_props_procedure @bookId, @propId 

    FETCH NEXT FROM migrate_cursor 
    INTO @bookId, @propId; 
END; 

CLOSE migrate_cursor; 
DEALLOCATE migrate_cursor; 

Maintenant, si cela était un grand resultset, vous voulez prendre en choses considération comme faisant le curseur avant uniquement et en lecture seule et d'éviter les verrous, mais cela devient l'idée générale à travers, sans trop compliquer l'exemple. Vous pouvez obtenir des informations plus détaillées à partir des documents au https://docs.microsoft.com/en-us/sql/t-sql/language-elements/cursors-transact-sql