2014-06-16 6 views
5

Sto tentando di eseguire la seguente operazione linq. Qui espressa come SQL:Unire e raggruppare per, utilizzando DataTable e Lista <T>

SELECT 
    CAMPAIGN, 
    ADGROUPID, 
    CLICKS, 
    TOTALCONV, 
    COST, 
    COSTCONVCLICK, 
    KEYWORD, 
    COUNT(*) AS APARICIONES 
FROM 
    ADWORDSSEARCH 
GROUP BY CAMPAIGN,adgrOUPID,CLICKS,TOTALCONV,COST,COSTCONVCLICK,KEYWORD 
ORDER BY CLICKS DESC 

ho preso a lavorare con la seguente espressione LINQ:

var filtro =(from r in newTable.AsEnumerable() 
      group r by new { 
           camp=r.Field<string>("CAMPAIGN"), 
           keyw= r.Field<string>("KEYWORD") 
          } 
      into grouping 
      select new 
      { 
       grouping.Key.camp, 
       grouping.Key.keyw, 
       Key = grouping.Key, 
       NumberGroup = grouping.Count() 
      }).ToList() 
       .OrderByDescending(t=>t.NumberGroup); 

Ma il problema è che nuovatabella è un DataTable ed ha un campo chiamato adgroupid che è numerico, e Devo fare un join con un elenco per sostituire l'ID numerico di AdGroupID con la sua descrizione. Questo è quello che ho provato finora:

var filtro = from r in newTable.AsEnumerable() 
      join anuncios in adslist.AsEnumerable() 
      on r.Field<string>("ADGROUPSID") equals anuncios.id.toString() 
      into grouping 
      select new 
      { 
       Campaign = r.Field<string>("CAMPAIGN"), 
       AdsName = anuncios.name ???? ->Here is the problem 
       keyword = r.Field<string>("KEYWORD"), 
       Counting = grouping.Count() 
      }; 

risposta

1

ho ottenuto che funziona utilizzando from d in grouping.DefaultIfEmpty()

   var filtro = (from r in newTable.AsEnumerable() 
          join anuncios in adslist.AsEnumerable() on r.Field<string>("ADGROUPID") equals anuncios.id.ToString() into grouping 
          from d in grouping.DefaultIfEmpty() 
          select new 
           { 

            Campaign = r.Field<string>("CAMPAIGN"), 
            AdName = d.name, 
            Clicks = r.Field<string>("CLICKS"), 
            TotalConv = r.Field<string>("TotalConvValue"), 
            Cost = r.Field<string>("Cost"), 
            CostConvClick = r.Field<string>("CostConvertedClick"), 
            keyword = r.Field<string>("KEYWORD"), 
            Counting = grouping.Count() 
           }).ToList().OrderByDescending(t => t.Clicks); 

Si sta inoltre lavorando con GROUP BY e poi unirsi, senza la clausola from:

List<AdwordsClass> filtro = (from r in newTable.AsEnumerable() 
            group r by new{ camp=r.Field<string>("CAMPAIGN"), id=r.Field<string>("adgroupid"), keyw= r.Field<string>("KEYWORD")} into grouping 
            join anuncios in adslist.AsEnumerable() on grouping.FirstOrDefault().Field<string>("ADGROUPID") equals anuncios.id.ToString() 
               select new AdwordsClass() 
            { 
             CampaignName = grouping.Key.camp, 
             CampaignId = Convert.ToInt64(grouping.FirstOrDefault().Field<string>("CAMPAIGNID")), 
             AdsGroupID = grouping.Key.id, 
             KeyWord = grouping.Key.keyw, 
             AdsGroupName = anuncios.name, 
             clicks = grouping.FirstOrDefault().Field<string>("CLICKS"), 
             TotalConv = grouping.FirstOrDefault().Field<string>("TotalConvValue"), 
             Cost =grouping.FirstOrDefault().Field<string>("Cost"), 
             CostConvClick =grouping.FirstOrDefault().Field<string>("CostConvertedClick"), 
             Counting = grouping.Count() 
            }).ToList().OrderByDescending(t => t.clicks).ToList(); 
Problemi correlati