次の方法で共有


汎用フィールド メソッドと SetField メソッド (LINQ to DataSet)

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の列値にアクセスでき、SetFieldDataRowの列値を設定します。 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 オブジェクトに保存されます。

こちらも参照ください