Delen via


Algemene veld- en SetField-methoden (LINQ naar DataSet)

LINQ naar DataSet biedt uitbreidingsmethoden voor de DataRow-klasse voor het openen van kolomwaarden: de methode Field en de SetField methode. Deze methoden bieden eenvoudiger toegang tot kolomwaarden voor ontwikkelaars, met name met betrekking tot null-waarden. De DataSet gebruikt DBNull.Value om null-waarden weer te geven, terwijl LINQ gebruikmaakt van de typen Nullable en Nullable<T>. Als u de bestaande kolomtoegangsfunctie in DataRow gebruikt, moet u het retourobject naar het juiste type casten. Als een bepaald veld in een DataRow 'null' kan zijn, moet u expliciet controleren op een 'null'-waarde omdat het retourneren van DBNull.Value en het vervolgens impliciet omzetten naar een ander type een InvalidCastExceptionveroorzaakt. Als in het volgende voorbeeld de DataRow.IsNull methode niet is gebruikt om te controleren op een null-waarde, wordt er een uitzondering gegenereerd als de indexeerfunctie DBNull.Value heeft geretourneerd en deze probeert te casten naar een 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

De methode Field biedt toegang tot de kolomwaarden van een DataRow en de SetField stelt kolomwaarden in een DataRowin. Zowel de Field-methode als de SetField methode verwerken null-waardetypen, dus u hoeft niet expliciet te controleren op null-waarden zoals in het vorige voorbeeld. Beide methoden zijn generieke methoden, dus u hoeft het retourtype ook niet te casten.

In het volgende voorbeeld wordt de methode Field gebruikt.

// 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

Houd er rekening mee dat het gegevenstype dat is opgegeven in de algemene parameter T van de methode Field en de SetField-methode moet overeenkomen met het type onderliggende waarde. Anders wordt er een InvalidCastException exceptie geworpen. De opgegeven kolomnaam moet ook overeenkomen met de naam van een kolom in de DataSet, of er wordt een ArgumentException gegenereerd. In beide gevallen wordt de uitzondering tijdens runtime gegenereerd tijdens de inventarisatie van de gegevens wanneer de query wordt uitgevoerd.

De methode SetField zelf voert geen typeconversies uit. Dit betekent echter niet dat er geen typeconversie plaatsvindt. Met de methode SetField wordt het ADO.NET gedrag van de DataRow-klasse weergegeven. Een typeconversie kan worden uitgevoerd door het DataRow-object en de geconverteerde waarde wordt vervolgens opgeslagen in het DataRow-object.

Zie ook