2016-05-04 14 views
0

Ich habe drei Tabellen.Ändern Sie die Reihenfolge aller Datensätze linq zu Sql C#

In ersten Tabelle Ich habe articleId, articleName ..., in zweite Tabelle storeId, storeName, storeLocation, maxNumOfArticles ... in dritten Tabelle articleId, storeId und order.

Ich möchte zum Beispiel in dem ersten Speichern neue Artikel hinzuzufügen. was

ich tun müssen, um den Auftrag für alle Artikel im Laden zu erhöhen, so würde der neue Artikel bestellt 1.

Zum Beispiel im Speicher hat A maxNumOfArticles = 5, wenn ich neue Artikel einzufügen, Artikel mit num 5 wird gelöscht, Artikel mit um 4, jetzt mit um 5, Artikel mit Bestellung wird 3 wird um 4 haben ..... und der neue Artikel wird um 1.

+0

warum Sie wollen um die Reihenfolge zu ändern? versuchen Sie es zu lesen top 5 geordnet absteigend nach Datum oder ID –

+0

und was hast du probiert? Können Sie den Code anzeigen? –

+0

Erstens: Es sieht wie ein Design-Problem aus. Warum sollte ein Datensatz mit Fremdschlüssel gelöscht werden, wenn ein neuer Datensatz eingefügt wird. Zweitens: ist die Nummer, die Sie Primärschlüssel mit Inkrement verwenden? Ist die Nummer in 'articleId' gespeichert? Ich würde es vorziehen, die von articleId desc bestellten Datensätze abrufen. –

Antwort

-1

haben Wenn Sie Top lesen möchten 5 in absteigender Reihenfolge bestellen, schauen Sie sich folgenden Code an:

myList.OrderByDescending(x => x.InsertDate).Take(5); 
2

Das ist nichts, was LINQ to SQL zu tun hat. Zunächst müssen Sie eine Ansicht, die automatisch Zahlen Sie Ihre Artikel von Speicher:

CREATE VIEW ArticleStoreView AS 
SELECT a.articleId , 
     a.articleName , 
     a.publicationDate, 
     asm.storeId , 
     s.storeName , 
     s.maxNumOfArticles, 
     ROW_NUMBER() OVER (PARTITION BY asm.storeId ORDER BY publicationDate DESC ) AS [Order] 
     FROM dbo.Article a INNER JOIN dbo.ArticleStoreMap asm ON asm.articleId = a.articleId 
INNER JOIN dbo.Store s ON s.storeId = asm.storeId 

Dadurch wird sichergestellt, dass Ihre Bestellung immer korrekt ist.


nur die relevanten Artikel zu erhalten, können Sie diese Abfrage schreiben:

SELECT asv.articleId , 
     asv.articleName , 
     asv.publicationDate , 
     asv.storeId , 
     asv.storeName , 
     asv.maxNumOfArticles , 
     asv.[Order] 
FROM dbo.ArticleStoreView asv 
WHERE asv.[Order] <= asv.maxNumOfArticles 
ORDER BY asv.publicationDate DESC 

die alten Artikel/Speicher-Karten zu löschen:

DELETE dbo.ArticleStoreMap 
FROM dbo.ArticleStoreMap asm 
     INNER JOIN dbo.ArticleStoreView asv ON asv.articleId = asm.articleId 
               AND asv.storeId = asm.storeId 
WHERE asv.[Order] > asv.maxNumOfArticles 

die alten Artikel zu löschen, die nicht mehr gemappt

DELETE dbo.Article 
FROM dbo.Article a WHERE NOT EXISTS (SELECT * FROM dbo.ArticleStoreMap asm WHERE asm.articleId = a.articleId)