2015-11-25 24 views
5

Così, ho cercato di replicare questo SQL query:query LINQ utilizzando GROUP BY e avendo

select COUNT(*) as Total_2_Review 
from (
    select processed_image_id, count(*) as Total_Confirm from dbo.history 
    where action_id=104 
    group by processed_image_id 
    having count(*) > 1 
) as tbl 

con Linq come segue:

var total2Review = (from h in secondDb.Histories.Where(i => i.ActionId == 104) 
        group h by new { h.ActionId, h.ProcessedImageId } into g 
        where g.Key.ActionId > 1 
        select g).Count(); 

Tuttavia, so che non dovrebbe essere giusto perché non sto selezionando il numero effettivo maggiore di 1 nella mia clausola di gruppo.

Come posso completare questa query SQL come una query LINQ?

+0

Perché stai raggruppamento da 'ActionId' nel Linq quando non si è in SQL? – juharr

risposta

6

Change Key.ActionId per .Count() nel where dopo il group by:

var total2Review = (from h in secondDb.Histories.Where(i => i.ActionId == 104) 
        group h by new { h.ActionId, h.ProcessedImageId } into g 
        where g.Count()> 1 
        select g).Count(); 
+0

Oh uomo! Ero così vicino! Grazie. Accetterò in un minuto –

+0

Prego;) – octavioccl

7

LINQ non fa alcuna differenza tra Where e Having. Una query SQL appropriata verrà generata in base al posizionamento della clausola Where.

Ecco come vorrei tradurre la vostra query SQL per LINQ:

var total2Review = secondDb.Histories 
    .Where(i => i.ActionId == 104) // This "Where" remains a "where" 
    .GroupBy(i => i.ProcessedImageId) 
    .Where(g => g.Count() > 1)  // This "Where" becomes "having" 
    .Count();      // This gets the overall count 
+0

Grazie per la spiegazione –