[C#.NET][LINQ] Query DataTable

  • 31779
  • 0
  • LINQ
  • 2015-12-28

[C#.NET][LINQ] Query DataTable

本文連結:

弱型別的 DataTable:

強型別的 DataTable:


弱型別的 DataTable:

要使用 LINQ,必須透過 AsEnumerable() + DataRow.Field(),如下範例程式碼

{
    {
        var query = GetConsumerTable();
        query.Dump("原始資料");
    }
    
    {
        var query = from row in GetConsumerTable().AsEnumerable()
                    where row.Field<string>("Name").Length > 4
                    select row ;
                    
        query.Dump();
    }
    
}

// Define other methods and classes here
public DataTable GetConsumerTable()
{
    DataTable table = new DataTable();
      table.Columns.Add("Id");
    table.Columns.Add("Name");

    table.Rows.Add("1", "kobe");
    table.Rows.Add("2", "jordan");
    table.Rows.Add("3", "yao");
    return table;    
}

 

執行結果如下圖

image

 

強型別的 DataTable:

依上述例子手動將弱型別的 DataTable 轉成強型別 DataTable

實作 DataRow:

{
    public int? Id
    {
        get { return (int)base["Id"]; }
        set { this["Id"] = value; }
    }

    public string Name
    {
        get { return (string)base["Name"]; }
        set { this["Name"] = value; }
    }

    internal ConsumerRow(DataRowBuilder builder)
        : base(builder)
    {
        this.Id = -1;
        this.Name = String.Empty;
    }
}

 

再來實作 TypedTableBase<ConsumerRow>,MSDN上說:『這個型別是做為 Visual Studio 和 XSD.exe .NET Framework 工具所產生之 DataTable 型別物件的基底類別,不建議直接在您的程式碼中使用。』

不過,有了 TypedTableBase<T>,就能具有強型別的查詢

{
    public ConsumerRow this[int index]
    {
        get { return (ConsumerRow)Rows[index]; }
    }

    public ConsumerTable()
    {
        this.Columns.Add(new DataColumn("Id", typeof(int)));
        this.Columns.Add(new DataColumn("Name", typeof(string)));
    }

    public void AddConsumerRow(ConsumerRow row)
    {
        this.Rows.Add(row);
    }

    public void RemoveConsumerRow(ConsumerRow row)
    {
        this.Rows.Remove(row);
    }

    public ConsumerRow NewConsumerRow()
    {
 
        return (ConsumerRow)NewRow();
    }

    protected override Type GetRowType()
    {
        return typeof(ConsumerRow);
    }
    
    protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
    {
        return new ConsumerRow(builder);
    }
}

 

建立假資料

{
    public static ConsumerTable GetConsumerTable()
    {
        ConsumerTable table = new ConsumerTable();
        {
            ConsumerRow row = table.NewConsumerRow();
            row.Id = 1;
            row.Name = "kobe";
            table.AddConsumerRow(row);
        }
        
        {
            ConsumerRow row = table.NewConsumerRow();
            row.Id = 2;
            row.Name = "jordan";
            table.AddConsumerRow(row);
        }    
        {
            ConsumerRow row = table.NewConsumerRow();
            row.Id = 3;
            row.Name = "yao";
            table.AddConsumerRow(row);
        }    
        return table;
    }
}

 

使用 LINQ Query

{
    {
        var query = Generation.GetConsumerTable().Where(g => g.Id==1);    
        query.Dump();
    }
}

 

執行結果如下:

image

 

PS.手動建立強型別的 DataTable 還蠻麻煩的,如果很懶,可以使用 VS 內建的 DataSet 來幫忙,不過彈性就會受限

image


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/07/14/145944.aspx

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo