LINQ to DataSet では、列の値 (DataRow メソッドと Field メソッド) にアクセスするための拡張メソッドがSetField クラスに提供されます。 これらのメソッドを使用すると、特に null 値に関して、開発者は列の値に簡単にアクセスできます。 DataSetではDBNull.Valueを使用して null 値を表しますが、LINQ ではNullable型とNullable<T>型が使用されます。 DataRowで既存の列アクセサーを使用するには、戻りオブジェクトを適切な型にキャストする必要があります。 DataRow内の特定のフィールドが null になる可能性がある場合は、DBNull.Valueを返し、暗黙的に別の型にキャストするとInvalidCastExceptionがスローされるため、null 値を明示的に確認する必要があります。 次の例では、 DataRow.IsNull メソッドを使用して null 値をチェックしなかった場合、インデクサーが DBNull.Value 返され、 Stringにキャストしようとした場合、例外がスローされます。
// 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: {product.Name}");
Console.WriteLine($"Product number: {product.ProductNumber}");
Console.WriteLine($"List price: ${product.ListPrice}");
Console.WriteLine("");
}
' 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
Fieldメソッドは、DataRowの列値にアクセスでき、SetFieldはDataRowの列値を設定します。 Field メソッドと SetField メソッドの両方が null 許容値型を処理するため、前の例のように null 値を明示的にチェックする必要はありません。 どちらのメソッドもジェネリック メソッドであるため、戻り値の型をキャストする必要はありません。
次の例では、 Field メソッドを使用します。
// 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: {product.Name}");
Console.WriteLine($"Product number: {product.ProductNumber}");
Console.WriteLine($"List price: ${product.ListPrice}");
Console.WriteLine("");
}
' 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
T
メソッドと Field メソッドのジェネリック パラメーターSetFieldで指定されたデータ型は、基になる値の型と一致する必要があることに注意してください。 それ以外の場合は、InvalidCastException 例外が発生します。 指定された列名はDataSet内の列名と一致する必要があります。一致しない場合、ArgumentExceptionがスローされます。 どちらの場合も、クエリの実行時にデータを列挙している際に例外がスローされます。
SetField メソッド自体は型変換を実行しません。 ただし、これは型変換が発生しないという意味ではありません。 SetField メソッドは、DataRow クラスの ADO.NET 動作を公開します。 型変換は DataRow オブジェクトによって実行でき、変換後の値は DataRow オブジェクトに保存されます。