【问题标题】:LINQPad: How to get row count in a table using MetaTable type?LINQPad:如何使用 MetaTable 类型获取表中的行数?
【发布时间】:2010-08-12 11:45:47
【问题描述】:

在 LINQPad 中,我正在尝试打印数据库中的所有表以及每个表中的行数:

this.Mapping.GetTables().Select(o => new { TableName = o.TableName, RowCount = ? })

如何计算行数?

【问题讨论】:

    标签: .net linqpad


    【解决方案1】:

    我需要做同样的事情,我只查看包含数据的表。我很快发现你必须小心你从这里拉回来的东西,因为数据是深深嵌套的。下面的查询在我的机器上运行不到一秒钟,我在数据库中有大约 266 个表(不包括视图)。 我希望这能回答你的问题。

     var list = this.Mapping.GetTables()    
         .Select(o => new { 
        TableName = o.TableName, 
        Type_ = o.RowType.Type, 
        IsEntity = o.RowType.IsEntity,
        RowCount = this.GetTable(o.RowType.Type).Cast<object>().Count(),
        })
        .Where (o => o.IsEntity && o.RowCount > 0)
        .ToList();
    
     list.Dump();
    

    【讨论】:

      【解决方案2】:
      this.Mapping.GetTables().Select(o => new { 
          TableName = o.TableName, 
          RowCount = (
              (IEnumerable<object>)this.GetType().GetProperty(
                  o.TableName.Substring(1, o.TableName.Length-2)
          ).GetValue(this, null))
          .Count()
      }).Dump();
      

      感谢this answer from Jason 展示了如何按名称查找表。

      【讨论】:

        【解决方案3】:

        试试这个:

        var list = this.Mapping.GetTables()
            .Select(o => new { TableName = o.TableName, Type_ = o.Row.Type, RowCount = 0 }).ToList();
        
        list.ForEach(x=>x.RowCount  = this.GetTable(x.Type_).Count);
        list.Select(o=> new { TableName = o.TableName, RowCount = 0 });
        

        【讨论】:

        • 这完全不好。为什么要向 DB 发送直接 SQL 语句并绕过所有可用于 Linq 查询的强类型检查?
        • 他使用的是 LinqPad,不是生产系统,而是沙盒。
        • 没关系。仍然是一个糟糕的建议。那是草率的编程,并没有解决问题。
        【解决方案4】:

        试试这个:

        var list = from o in this.Mapping.GetTables()
        let rowCount = ExecuteQuery<int>("select count(*) from "+ o.TableName).FirstOrDefault()
         select new {
            TableName = o.TableName,
                RowCount = rowCount
          };
        

        【讨论】:

          【解决方案5】:

          或者不使用映射:

          this.GetType().GetProperties().Where(p => p.DeclaringType == typeof(TypedDataContext)).Select(t => new 
          { 
              TableName = t.Name,
              RowCount = ((IEnumerable<object>)(this.GetType().GetProperty(t.Name).GetValue(this, null))).Count()
          }).Dump();
          

          【讨论】:

            【解决方案6】:

            这不是 LinqPad 问题,而是 Linq 问题。但是让我给你一个很好的 LinqPad 技巧。将 .Dump() 添加到您的查询中,看看您会得到什么 - 非常酷。

            this.Mapping.GetTables().Select(o => new { TableName = o.TableName, RowCount = ? }).Dump()
            

            【讨论】:

            • 如何在此处添加 Dump 帮助?我知道 Dump 方法并且知道它很酷,但是它与这个问题有什么关系?
            • 我不明白转储如何在这里提供帮助?我应该在哪里添加它才能看到您在说什么?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-16
            • 1970-01-01
            相关资源
            最近更新 更多