J'ai une table qui stocke l'historique des changements sur un produit et que vous souhaitez obtenir une liste d'enregistrements qui ont un changement de Col1 ou Col2 ou Col3, mais ne me montrent pas des enregistrements qui n'ont pas de changement dans l'un de ces trois Colonnes.
Voici un exemple fait dans SQL. Comment procédez-vous à Linq? P>
Créer une table temporaire pour tester P>
var query=( from ph in ProductHistorical.Where(p=>p.IdProduct==1) orderby ph.DateChange ascending select new ProductHistoricalItem { DateChange = ph.DataChange, Col1 = ph.Col1, Col2 = ph.Col2, Col3 = ph.Col3 }); List<ProductHistoricalItem> listResult=new List<ProductHistoricalItem>(); ProductHistoricalItem previous = null; foreach (ProductHistoricalItem item in query) { if (previous == null || previous.Col1 != item.Col1 || previous.Col2 != item.Col2 || previous.Col3 != item.Col3) { listResult.Add(item); previous = item; } }
3 Réponses :
Fondamentalement, j'ai essayé d'appliquer exactement votre logique et de le convertir en code LINQ.
SELECT [t10].[test], [t10].[IdProductHistorical], [t10].[IdProduct], [t10].[DateChange], [t10].[Col1], [t10].[Col2], [t10].[Col3] FROM ( SELECT [t5].[test], [t5].[IdProductHistorical], [t5].[IdProduct], [t5].[DateChange], [t5].[Col1], [t5].[Col2], [t5].[Col3] FROM ( SELECT [t0].[IdProduct], [t0].[Col1], [t0].[Col2], [t0].[Col3] FROM [dbo].[ProductHistorical] AS [t0], [dbo].[ProductHistorical] AS [t1] WHERE ([t0].[IdProduct] = [t1].[IdProduct]) AND ([t0].[IdProductHistorical] > [t1].[IdProductHistorical]) AND (([t1].[Col1] <> [t0].[Col1]) OR ([t1].[Col2] <> [t0].[Col2]) OR ([t1].[Col3] <> [t0].[Col3])) GROUP BY [t0].[IdProduct], [t0].[Col1], [t0].[Col2], [t0].[Col3] ) AS [t2] OUTER APPLY ( SELECT TOP (1) 1 AS [test], [t3].[IdProductHistorical], [t3].[IdProduct], [t3].[DateChange], [t3].[Col1], [t3].[Col2], [t3].[Col3] FROM [dbo].[ProductHistorical] AS [t3], [dbo].[ProductHistorical] AS [t4] WHERE ([t2].[IdProduct] = [t3].[IdProduct]) AND ([t2].[Col1] = [t3].[Col1]) AND ([t2].[Col2] = [t3].[Col2]) AND ([t2].[Col3] = [t3].[Col3]) AND ([t3].[IdProduct] = [t4].[IdProduct]) AND ([t3].[IdProductHistorical] > [t4].[IdProductHistorical]) AND (([t4].[Col1] <> [t3].[Col1]) OR ([t4].[Col2] <> [t3].[Col2]) OR ([t4].[Col3] <> [t3].[Col3])) ORDER BY [t3].[IdProductHistorical] ) AS [t5] UNION SELECT [t9].[test], [t9].[IdProductHistorical], [t9].[IdProduct], [t9].[DateChange], [t9].[Col1], [t9].[Col2], [t9].[Col3] FROM ( SELECT [t6].[IdProduct] FROM [dbo].[ProductHistorical] AS [t6] GROUP BY [t6].[IdProduct] ) AS [t7] OUTER APPLY ( SELECT TOP (1) 1 AS [test], [t8].[IdProductHistorical], [t8].[IdProduct], [t8].[DateChange], [t8].[Col1], [t8].[Col2], [t8].[Col3] FROM [dbo].[ProductHistorical] AS [t8] WHERE [t7].[IdProduct] = [t8].[IdProduct] ORDER BY [t8].[IdProductHistorical] ) AS [t9] ) AS [t10]
Merci pour votre réponse. C'est exactement ce dont j'avais besoin!
Si vous êtes prêt à implémenter votre propre méthode d'extension LINQ, vous pouvez utiliser une version «dans laquelle-utilisation» (la mise en œuvre initiale a été sélectionnéeWithPrevious, de ICI ), comme: Et la requête ressemblerait à ceci: P>
Merci de votre réponse, mais la réponse de Scorpi0 est la meilleure pour mon problème.
Que diriez-vous de cela?
+1 pour donner la table Create et insère des déclarations.