LINQPadでは、データベース内のすべてのテーブルと各テーブルの行数を出力しようとしています。
this.Mapping.GetTables().Select(o => new { TableName = o.TableName, RowCount = ? })
行数はどのように計算できますか?
同じことをする必要があり、データを含むテーブルのみを探していました。データが深くネストされているため、ここから何を引き出すかについて注意する必要があることがすぐにわかりました。以下のクエリは、私のマシンで実行するのに 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();
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();
名前でテーブルを検索する方法を示してくれたJasonからのこの回答に敬意を表します。
これを試して:
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 });
または Mapping を使用せずに:
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();
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
};
これは LinqPad の問題ではなく、Linq の問題です。しかし、LinqPad の素敵なヒントを教えてください。クエリに .Dump() を追加して、何が得られるかを確認してください - とてもクールです。
this.Mapping.GetTables().Select(o => new { TableName = o.TableName, RowCount = ? }).Dump()