2010-10-18 2 views
0

У меня есть запрос LINQ, который возвращает статьи упорядоченных по числу тегов, которые соответствуют данной статьеGroup с помощью LINQ возврата DataTable

например

текущей статьи тегов - tag1, tag2 Tag3

отмеченных в статье 1 - tag1, tag2 tag3 помечено статья 2 - tag1, tag2

LINQ я имею

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(); 

я хочу, чтобы добавить группу по ClassName, который является тип статьи (литература, пример, скачать и т.д.)

так будет

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

однако, когда я добавить это в запросе я получаю красный 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(); 

любые идеи, что я делаю неправильно?

Это ток, который работает только с приказом по

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

Вы должны предоставить пример, по крайней мере, весьма близко к компиляции. 1) «Сепаратор» не определен. 2) currenttags не определено. 3) Метод расширения CopyToDataTable не определен. Прочтите http://tinyurl.com/so-hints, особенно раздел «Пример кода и данных». –

+0

Какие ошибки вы получаете. «красные squiggles» не очень точное описание проблемы. –

ответ

1

Если вы пытаетесь сделать заказ по количеству, и в пределах каждого значения счетчика, группировать строки по ClassDisplayName, вы можете попробовать это:

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

, поэтому мне не нужно использовать «group row by row.Field (« ClassDisplayName ») в g"? извините за новый linq – Adam

+0

, если я правильно понимаю, что вы пытаетесь сделать (закажите по счету, затем по классу displayname), тогда вам не нужна «группа». –

+0

то, что я хочу делать с данными, связывает его с вложенным ретранслятором, поэтому все казули будут проходить под кастерами и литературой по литературе. вот почему я думал о usinig «group» – 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(); 

, а затем другой запрос на внутренней вложенного повторителя

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(); 

нибудь есть лучшее решение, дайте мне знать,

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(); 
Смежные вопросы