J'essaie d'écrire une instruction Linq to SQL qui affiche tous les enregistrements clients et uniquement le max correspondant (InvoiceId) de la table de facture; essentiellement la plus récente facture pour le client. La jointure à gauche est requise car un client peut ne pas avoir de factures mais doit être dans le jeu de résultats.Linq to SQL: Left Joindre à l'agrégat MAX
Deux tables de base avec une clé étrangère de Client.IDClient = Invoice.CustomerId
CREATE TABLE [dbo].[Customer](
[CusomerId] [int] IDENTITY(1,1) NOT NULL,
[CustomerName] [int] NOT NULL
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(
[CustomerId] ASC
)
) ON [PRIMARY]
CREATE TABLE [dbo].[Invoice](
[InvoiceId] [int] IDENTITY(1,1) NOT NULL,
[CustomerId] [int] NOT NULL,
[InvoiceTotal] [float] NOT NULL
CONSTRAINT [PK_Invoice] PRIMARY KEY CLUSTERED
(
[InvoiceId] ASC
)
) ON [PRIMARY]
Le SQL du jeu de résultat souhaité est la suivante:
SELECT *
FROM Customers c
LEFT JOIN
(Invoice i
INNER JOIN (SELECT CustomerId, MAX(InvoiceId) as InvId FROM Invoice GROUP BY CustomerId) as InvList
ON i.InvoiceNo = InvList.InvoiceNo) ON c.CustomerId = i.CustomerId
D'après ce que j'ai découvert, Je ne pense pas que cela puisse être fait dans une seule déclaration; que le produit MAX (InvoiceId) doit être créé en premier et utilisé dans l'instruction principale. Puisque je ne peux pas le faire fonctionner, peut-être que j'ai tort à ce sujet aussi.
Cela ne semble pas fonctionner comme prévu. Même problème que je courais en moi-même. J'utilise votre exemple de bloc de code du milieu. La jointure à gauche fonctionne bien jusqu'à la ligne "joindre la facture dans ctx.Invoice sur latestInvoice.InvoiceId vaut facture.InvoiceId" Lorsque cette ligne est ajoutée dans je n'obtiens plus tous les clients, seulement les clients avec les factures max correspondantes. – Brettski
Ben Je vous remercie sincèrement pour votre réponse; cela m'a permis de découvrir la solution dont j'avais besoin pour mon projet. Je voudrais également ajouter que n'importe qui là-bas apprend Linq, pour utiliser LinqPad pour comprendre vos questions. Je ne sais pas où je serais sans cet outil, j'ai même payé pour l'option itellisense. :) – Brettski
Hmm. J'ai copié le motif à partir d'une requête existante qui fonctionne, mais je dois avoir manqué une différence clé - je ne sais toujours pas pourquoi cela n'a pas fonctionné pour vous. Quoi qu'il en soit, je suis heureux de pouvoir vous aider à le résoudre! –