2010-09-16 3 views
0

Je suis en train de faire un bogue pour répliquer une requête SQL dans LINQ. Quelqu'un peut-il aider?Conversion d'une requête SQL avec un groupe en une requête LINQ

SQL:

SELECT tblInvoice.lngID AS InvoiceID, 
       tblInvoice.dtTimeStamp AS InvoiceDate, 
       tblInvoice.strReference, 
       tblInvoice.fltTotalValue, 
       max(Project.ProjectID) AS ProjectID, 
       max(Project.ProjectName) AS ProjectName, 
       max(Project.Location) AS ProjectLocation 
     FROM tblInvoice INNER JOIN 
       tblInvoiceLine ON tblInvoice.lngID = tblInvoiceLine.lngInvoiceID 
     WHERE (tblInvoice.intStatus != 0) 
     AND  (tblInvoice.lngPersonID = @PersonID) 
     GROUP BY tblInvoice.lngID, tblInvoice.dtTimeStamp, strReference, fltTotalValue 
     ORDER BY tblInvoice.lngID DESC 

LINQ jusqu'à présent:

var invoices = from inv in db.TblInvoices 
    join invLine in db.TblInvoiceLines on inv.LngID equals invLine.LngInvoiceID 
    where inv.IntStatus != 0 
    where inv.LngPersonID == personID 
    group inv by new {inv.LngID,inv.DtTimeStamp,inv.StrReference,inv.FltTotalValue} into newInv 

Une partie du problème est que je veux faire un

select new Invoice(){ 
} 

et construire mon objet personnalisé facture mais , Je ne vois pas l'une des propriétés de newInv.

Quelqu'un peut-il nous conseiller?

Répondre

1

Je n'ai pas le temps pour une réponse complète maintenant, mais:

  • Pour obtenir à des propriétés de la clé, utilisez newInv.Key.StrReference etc
  • Pour obtenir des agrégats (par exemple à des valeurs max) utiliser newInv.Max(x => x.ProjectId) etc

Espérons que ce sera suffisant pour vous lancer. Fondamentalement, newInv sera un groupe des entrées, avec une clé associée (qui est ce que vous avez regroupé par).

+0

Merci pour cela Jon j'ai eu un peu de gel du cerveau hier. – DazManCat

+0

Bien sûr, l'autre option consiste à faire une requête LINQ simple, puis à faire une facture.GroupBy (x => new {x.InvoiceID, x.InvoiceDate, x.Reference, x.TotalValue}); – DazManCat