【问题标题】:Group using linq return datatable使用 linq 返回数据表进行分组
【发布时间】:2010-10-18 10:05:08
【问题描述】:

我有一个 linq 查询,它返回按与当前文章匹配的标签数量排序的文章

例如

当前文章有标签 - 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")}

但是,当我将它添加到查询中时,我会得到红色的波浪线

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

任何想法我做错了什么?

这是当前仅适用于 order by 的命令

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

【问题讨论】:

  • 您需要提供一个至少非常接近编译的示例。 1)“分隔符”未定义。 2) currenttags 未定义。 3) 扩展方法 CopyToDataTable 未定义。阅读tinyurl.com/so-hints,尤其是示例代码和数据部分。
  • 您遇到了什么错误。 “红色曲线”不是一个非常精确的问题描述。

标签: asp.net linq linq-to-sql


【解决方案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();

【讨论】:

  • 所以我不需要使用“逐行分组.Field("ClassDisplayName") 到 g”?对不起 linq 的新手
  • 如果我正确理解了您要执行的操作(按计数排序,然后按类显示名称排序),那么您不需要“组”。
  • 我想要对数据做的是将其绑定到嵌套中继器,因此所有案例研究都将在案例研究和文献下。这就是为什么我想使用“组”
  • 我对嵌套中继器控件不是很熟悉。您可以使用它们在单个表中显示层次结构,还是需要将它们绑定到父表和相关子表?
  • 我认为父子表,这就是为什么我正在研究使用 linq 进行分组的原因。这会返回多张桌子吗?
【解决方案2】:
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();

【讨论】:

    【解决方案3】:
     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();
    

    谁有更好的解决办法告诉我

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多