6
votes

Différences de filtre de filtre LINQ dans l'historique

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;
    }
}


1 commentaires

+1 pour donner la table Create et insère des déclarations.


3 Réponses :


2
votes

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]


1 commentaires

Merci pour votre réponse. C'est exactement ce dont j'avais besoin!



2
votes

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: XXX

Et la requête ressemblerait à ceci: xxx


1 commentaires

Merci de votre réponse, mais la réponse de Scorpi0 est la meilleure pour mon problème.



0
votes

Que diriez-vous de cela? XXX


0 commentaires