2010-10-18 5 views
0

i ont une requête LINQ qui renvoie les articles commandés par le nombre de balises qui correspondent à l'actuel articleGroupe en utilisant le retour de LINQ datatable

par exemple

article en cours a des balises - balise1, tag2, tag3

étiqueté article 1 - tag1, tag2, tag3 article étiqueté 2 - tag1, tag2

linq i ai est

DataTable query = (from row in dt.AsEnumerable() 
          let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries) 
          let count = tags.Count(t => currenttags.Contains(t)) 
          orderby count descending 
          select row).CopyToDataTable(); 

je veux ajouter le groupe par ClassName qui est le type d'article (littérature, étude de cas, télécharger, etc.)

donc serait

group row by {row.Field<string>("ClassDisplayName")} 

mais quand je l'ajouter à la requête que je reçois rouge sqiggles

DataTable query = (from row in dt.AsEnumerable()  
          group row by {row.Field<string>("ClassDisplayName")} 
          let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries) 
          let count = tags.Count(t => currenttags.Contains(t))        
          orderby count descending        
          select row).CopyToDataTable(); 

des idées ce que je fais mal?

Ceci est l'actuel qui fonctionne avec juste l'ordre par

DataTable dt = ArticleCollection(SqlClause.ToString()); 

     var seperator = new[] { ",", " " }; 
     var current = dr["Tags"].ToString(); 
     var currenttags = dr.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries); 

     DataTable query = (from row in dt.AsEnumerable()        
          let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries) 
          let count = tags.Count(t => currenttags.Contains(t)) 
          orderby count descending 
          // group row by row.Field<string>("ClassDisplayName") into g 
          select row).CopyToDataTable(); 


     if (!DataHelper.DataSourceIsEmpty(query)) 
     { 
      TagRepeaterOutter.DataSource = query; 
      TagRepeaterOutter.DataBind(); 
     } 
+0

Vous devez fournir un exemple au moins est assez proche de la compilation. 1) 'seperator' est indéfini. 2) currenttags est indéfini. 3) La méthode d'extension CopyToDataTable est indéfinie. Lisez http://tinyurl.com/so-hints, en particulier la section sur le code et les données. –

+0

Quelles sont les erreurs que vous obtenez. "squiggles rouges" n'est pas une description très précise du problème. –

Répondre

1

Si vous essayez de commander en nombre, et dans chaque valeur de comptage, regrouper les lignes par ClassDisplayName, vous pouvez essayer ceci:

DataTable query = (from row in dt.AsEnumerable()        
        let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries) 
        let count = tags.Count(t => currenttags.Contains(t)) 
        let displayName = row.Field<string>("ClassDisplayName") 
        orderby count descending, displayName 
        select row).CopyToDataTable(); 
+0

donc je n'ai pas besoin d'utiliser "group row by row.Field (" ClassDisplayName ") dans g"? désolé nouveau à linq – Adam

+0

si je comprends bien ce que vous essayez de faire (ordre par nombre, puis par classdisplayname), alors vous n'avez pas besoin de 'groupe'. –

+0

ce que je veux faire avec les données est le lier à un répéteur imbriqué, de sorte que toutes les études de cas seront sous caserstudies et de la littérature sous la littérature. C'est pourquoi je pensais à usinig "groupe" – Adam

0
IEnumerable<DataRow> types = (from row in dt.AsEnumerable() 
             group row by row.Field<string>("ClassDisplayName") into g 
             select g.FirstOrDefault()); 

     DataTable dtType = types.CopyToDataTable(); 

puis une autre requête sur le répéteur interne imbriquée

DataTable query = (from row in dt.AsEnumerable() 
           where (row.Field<string>("ClassDisplayName") == dr["ClassDisplayName"].ToString()) 
           let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries) 
           let count = tags.Count(t => currenttags.Contains(t))         
           orderby count descending        
           select row).CopyToDataTable(); 

quelqu'un a une meilleure solution me faire savoir

1
DataTable query = (from row in dt.AsEnumerable() 
        where (row.Field<string>("ClassDisplayName") == dr["ClassDisplayName"].ToString()) 
        let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries) 
        let count = tags.Count(t => currenttags.Contains(t)) 
        orderby count descending 
        select row).CopyToDataTable();