2017-07-24 7 views
-4

Voici ma requête SQL fonctionne bien dans SQL:Quelqu'un peut-il m'aider à convertir SQL en requête linq. J'ai essayé mais échoué

select ld.FolderId, count(ld.LeadId) LeadID, sum(note.noteCount) NoteCount, count(ld.CallResultId) Calls 
from LeadsDetails ld 
    left join 
    (
     select lnh.LeadId, Count(lnh.NoteId) as noteCount 
     from [dbo].[LeadNoteHistory] lnh 
     group by lnh.LeadId 
    )note 
    on note.LeadId=ld.LeadId 
group by ld.FolderId 

J'ai essayé -

var query = 
    from lead in _context.LeadsDetails 
    join note in _context.LeadNoteHistories 
    on lead.LeadId equals note.LeadId into g 
    from notes in g.DefaultIfEmpty() 
    group lead by lead.FolderId into grp 
    select new 
    { 
     FolderId = g.FolderId, 
     LeadID = g.LeadId, 
     NoteCount = notes.NoteId, 
     Call = lead.CallResultId 
    }; 

Impossible d'obtenir le bon résultat. S'il vous plaît dites ce que je fais mal.

+0

Quel est le résultat que vous cherchez? – SandPiper

+0

voir la requête sql. Je veux créer une requête exacte dans LINQ – James

+0

http://www.sqltolinq.com/ –

Répondre

0

Vous ne pouvez pas accéder à la variable 'g' dans la clause select plus tard. Vous devez utiliser la variable 'grp'. Vous devez également modifier le groupe final par. J'ai essayé de modifier, voir si cela fonctionne:

var query = 
    from lead in _context.LeadsDetails 
    join note in _context.LeadNoteHistories 
    on lead.LeadId equals note.LeadId into g 
    from notes in g.DefaultIfEmpty() 
    group new {lead,notes} lead by lead.FolderId into grp 
    select new 
    { 
     FolderId = grp.Key, 
     LeadID = grp.Count(), 
     NoteCount = grp.Count(x=>x.notes!=null), 
     Call = grp.Count() 
    }; 
+0

presque- juste voir que dans le SQL il y a 'Sum' et' Count' pour les champs –

+0

Merci @GiladGreen. mis à jour la réponse – madcap

+0

NoteCount = grp.Count (x => x.notes! = null), impossible d'accéder à «notes» ici – James

0

Pour traduire SQL LINQ,

  1. Traduisez subselects comme variables distinctes

  2. Traduire chaque clause pour la clause LINQ, en laissant aux opérateurs monadiques (DISTINCT, TOP, etc) en tant que fonctions appliquées à l'ensemble de la requête LINQ.

  3. Utilisez des alias de table comme variables de plage. Utilisez les alias de colonne comme noms de champs de type anonyme.

  4. Utiliser des types anonymes (new { }) pour plusieurs colonnes

  5. jointure gauche est simulé en utilisant une jointure variable et faire une autre from de la variable join et .DefaultIfEmpty().

Voici votre SQL traduit:

var rightside = from lnh in dbo.LeadNoteHistory 
       group lnh by lnh.LeadId into lnhg 
       select new { LeadId = lnhg.Key, noteCount = lnhg.Count() }; 

var ans = from ld in dbo.LeadsDetails 
      join note in rightside on ld.LeadId equals note.LeadId into notej 
      from note in notej.DefaultIfEmpty() 
      group new { ld, note } by ld.FolderId into ldnoteg 
      select new { 
       FolderId = ldnoteg.Key, 
       LeadID = ldnoteg.Select(lng => lng.ld.LeadId).Count(), 
       NoteCount = ldnoteg.Select(lng => lng.note.noteCount).Sum(), 
       Calls = ldnoteg.Select(lng => lng.ld.CallResultId).Count() 
      }; 

J'ai quitté la LeadID définition que dans votre SQL, mais qui ne semble pas juste pour moi.

+0

Merci pour votre réponse, mais ces lignes donnent des erreurs. LeadID = ldnoteg.ld.LeadId.Count(), NoteCount = ldnoteg.note.noteCount.Sum(), Appels = ldnoteg.ld.CallResultId.Count() – James

+0

Désolé, je n'ai pas traduit correctement l'accès au groupe - Je l'ai corrigé. En regardant le LINQ par rapport au SQL, il est évident que le SQL a un certain nombre d'erreurs: LeadId ne devrait pas être un 'count', il n'y a pas de différence entre' count (ld.LeadId) 'et' count (ld.CallResultId) ' sans "DISTINCT". – NetMage