DataTableにLinqを使う

https://msdn.microsoft.com/ja-jp/library/bb386977.aspx

少しはLinqも使えるようになりたい。けど、使ってるのは基本的にDatatable。
だいぶ時代から乗り遅れちゃってる感じ。

それを少しでも埋めようと、DatatableもLinqできるようにしてみます。

メリットとしては、
LINQ to DataSet は、DataSet オブジェクトにキャッシュされたデータに対するクエリをより簡単に、より高速にします。 つまり、LINQ to DataSet では、クエリを記述するのにクエリ言語ではなくプログラミング言語そのものを使用できるので、クエリ操作が容易になります。 これは、Visual Studio 開発者にとって特に便利で、Visual Studio によって提供されるコンパイル時の構文チェック、静的な型指定、IntelliSense のサポートをクエリで利用できるようになります。

DataTableにLinqを利用する例
https://msdn.microsoft.com/ja-jp/library/system.data.datatableextensions.asenumerable(v=vs.110).aspx

 

using System;
using System.Data;

class Program {
public void DisplayProducts(DataTable table) {
var productNames = from products in table.AsEnumerable() select products.Field("ProductName");
Console.WriteLine("Product Names: ");
foreach (string productName in productNames) {
Console.WriteLine(productName);
}
}

static void Main(string[] args) {
DataTable table = new DataTable();
table.Columns.Add("ID");
table.Columns.Add("ProductName");

table.Rows.Add("1", "Chai");
table.Rows.Add("2", "Queso Cabrales");
table.Rows.Add("3", "Tofu");

Program inst = new Program();
inst.DisplayProducts(table);
}
}

 

var items = dt.AsEnumerable()
.Where(x => x["col1"].ToString() == "1")
.Select(x => x["col1"].ToString());

書き方の違い DataTable.select をLinq でやるとこんな感じです
DataRowを抽出する

DataTable.Select

System.Data.DataRow[] foundRows;
foundRows = datatable.Select("code01 =" + code01);

 

DataTable to Linq

var foundRows = (
from row in X_Start.Cache.dt_hono.AsEnumerable()
let code01 = row.Field("code01")
let name01 = row.Field("name01")
let product01 = row.Field("product01")
where code01 == code01
select row
).ToArray();

で同じ処理になります。処理は早くなるそうですが、コード量が多くなりますね(^^;

で、その後の処理は同じです。DataRowとして扱う事ができます。
以下、抽出されたデータが1件なら処理というコード

if (foundRows.Length == 1)
{
//別のインスタンスに代入
o.code01 = (int)foundRows[0]["code01"];
o.name01 = foundRows[0]["name01"].ToString();
o.product01 = (int)foundRows[0]["product01"];

this.Close();
}

cd = 18,19 というレコードは削除

                DataRow[] rows =
                    (from row in Cache.dt.AsEnumerable().Where(r => r.Field<int>("cd") == 18 || r.Field<int>("cd") == 19) select row).ToArray();
                Array.ForEach<DataRow>(rows, row => Cache.dt.Rows.Remove(row));