ジェネリック メソッド Field および SetField (LINQ to DataSet)
更新 : November 2007
LINQ to DataSet では、DataRow クラスの拡張メソッドとして、列値にアクセスするための Field メソッドおよび SetField メソッドが提供されています。開発者はこれらのメソッドを使用することで、列値に容易にアクセスできます。特に強化されている点は Null 値の扱いです。DataSet が Value を使って Null 値を表現するのに対し、LINQ では、.NET Framework 2.0 で導入された Null 許容型が使用されます。DataRow の既存の列アクセサを使用する場合、返されたオブジェクトを適切な型にキャストする必要があります。DataRow の特定のフィールドが NULL 値を許容している場合、Null 値を明示的にチェックする必要があります。Value を取得して、それを暗黙的に別の型にキャストしようとすると、InvalidCastException がスローされます。次の例では、IsNull メソッドを使用して Null 値をチェックしなかった場合、インデクサが Value を返し、それを String にキャストしようとすると、例外がスローされます。
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim products As DataTable = ds.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Where product!Color IsNot DBNull.Value AndAlso product!Color = "Red" _
Select New With _
{ _
.Name = product!Name, _
.ProductNumber = product!ProductNumber, _
.ListPrice = product!ListPrice _
}
For Each product In query
Console.WriteLine("Name: " & product.Name)
Console.WriteLine("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $" & product.ListPrice & vbNewLine)
Next
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
var query =
from product in products.AsEnumerable()
where !product.IsNull("Color") &&
(string)product["Color"] == "Red"
select new
{
Name = product["Name"],
ProductNumber = product["ProductNumber"],
ListPrice = product["ListPrice"]
};
foreach (var product in query)
{
Console.WriteLine("Name: {0}", product.Name);
Console.WriteLine("Product number: {0}", product.ProductNumber);
Console.WriteLine("List price: ${0}", product.ListPrice);
Console.WriteLine("");
}
Field は、DataRow の列値にアクセスするためのメソッドです。SetField は、DataRow の列値を設定するためのメソッドです。Field メソッドも SetField メソッドも Null 許容型を扱うことができるため、前出の例のように Null 値を明示的にチェックする必要はありません。また、どちらのメソッドもジェネリック メソッドであるため、戻り値の型をキャストする必要もありません。
次の例では、Field メソッドを使用します。
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim products As DataTable = ds.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Where product.Field(Of String)("Color") = "Red" _
Select New With _
{ _
.Name = product.Field(Of String)("Name"), _
.ProductNumber = product.Field(Of String)("ProductNumber"), _
.ListPrice = product.Field(Of Decimal)("ListPrice") _
}
For Each product In query
Console.WriteLine("Name: " & product.Name)
Console.WriteLine("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $ " & product.ListPrice & vbNewLine)
Next
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
var query =
from product in products.AsEnumerable()
where product.Field<string>("Color") == "Red"
select new
{
Name = product.Field<string>("Name"),
ProductNumber = product.Field<string>("ProductNumber"),
ListPrice = product.Field<Decimal>("ListPrice")
};
foreach (var product in query)
{
Console.WriteLine("Name: {0}", product.Name);
Console.WriteLine("Product number: {0}", product.ProductNumber);
Console.WriteLine("List price: ${0}", product.ListPrice);
Console.WriteLine("");
}
Field メソッドおよび SetField メソッドのジェネリック パラメータ T に指定するデータ型は、基になる値の型と一致している必要があります。それ以外の場合、InvalidCastException 例外がスローされます。指定する列の名前も DataSet 内の列名と一致している必要があります。一致していない場合、ArgumentException がスローされます。どちらの場合も、例外は、実行時にデータが列挙されて、クエリが実行されたときにスローされます。
SetField メソッド自体は、型変換を一切実行しません。ただし、型変換がまったく発生しないということではありません。SetField メソッドは、ADO.NET 2.0 の DataRow クラスの動作を公開します。DataRow オブジェクトによって型変換が実行され、変換後の値が DataRow オブジェクトに保存される場合もあります。