本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
少しは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));
DataTable.AsEnumerable() が使えない時には
エラー CS1061 'DataTable' に 'AsEnumerable' の定義が含まれておらず、型 'DataTable' の最初の引数を受け付けるアクセス可能な拡張メソッド 'AsEnumerable' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないかを確認してください。
と表示されるときに確認したいことは、
プロジェクトの参照で
System.Data.DataExtensions
が追加されているか?
Using System.Data;
が追加されているか?
をご確認ください。