Группировка с использованием linq return datatable - PullRequest
0 голосов
/ 18 октября 2010

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

например,

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

tagged article 1 - tag1, tag2, tag3 tagged article 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")}

, однако, когда я добавляю это к запросу, я получаю красные сообщения

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

Ответы [ 3 ]

1 голос
/ 22 марта 2011
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 голос
/ 18 октября 2010

Если вы пытаетесь упорядочить по количеству и в пределах каждого значения счетчика сгруппировать строки по 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 голосов
/ 20 октября 2010
 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();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...